2010-01-11 2 views
4

Я создал тип данных для хранения основных пользовательских данных и загрузки его в ghci. Затем я использовал ghci для поиска новой сигнатуры типа типов данных. Я скопировал сигнатуру типа из ghci в исходный файл и попытался перезагрузить файл. Ghci сделал ошибку.Ошибка типа Haskell с использованием выводимого типа

Код и погрешность приведены ниже.

Мой вопрос в том, почему это порождает ошибку. Я использовал тип, который был выведен ghci.

User :: Int -> String -> String -> String -> String -> User 
data User = User { userID :: Int, 
        login :: String, 
        password :: String, 
        username :: String, 
        email :: String 
        } deriving (Show) 

Прелюдия>: г Пользователь [1 из 1] Сборка пользователя (User.hs, интерпретированы)

User.hs: 3: 0: Недопустимый тип подписи потерпели неудачу, загруженные модули : никто.

ответ

14

Вы можете объявить тип значения (например, функцию), но вы не можете объявить тип типа данных или конструктор данных, используя синтаксис объявления типа для значений. Фактически, вы уже объявляете полный тип типа данных и конструктора данных при их определении, поэтому нет необходимости в дополнительном объявлении типа. Так что просто оставьте линию User :: ...; эта строка является синтаксической ошибкой, так как User с капиталом U (конструктор) и только имена (значения) в нижнем регистре могут иметь указанные типы.

5

Кстати, если вы хотели бы написать пользователя в «тип» annotationy у стиля, вы можете сделать это с GADT синтаксисом:

{-# LANGUAGE GADTs #-} 

data User where 
    User :: Int -> String -> String -> String -> String -> User 
+0

Спасибо за дополнительную информацию; это хороший совет. – BlueBadger