2010-01-11 40 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) 

前奏>,R用户[1 1]编译 用户(User.hs, 解释)

User.hs:3:0:无效类型签名 失败,模块加载: 没有。

回答

14

您可以声明一个值的类型(例如函数),但是您不可以使用值的类型声明语法来声明数据类型或数据构造函数的类型。实际上,当你定义它们时,你已经声明了数据类型和数据构造函数的完整类型,所以不需要额外的类型声明。所以只需要删除User :: ...;该行是语法错误,因为它具有大写U(构造函数)User,并且只有小写名称(值)可能归属类型。

5

顺便说一句,如果你想在“类型annotationy” Y的风格来写用户,你可以用GADT语法这样做:

{-# LANGUAGE GADTs #-} 

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

感谢其他信息;这是一个很好的提示。 – BlueBadger 2010-01-17 06:12:12