Haskell类型错误使用推断类型

4
我创建了一个数据类型来保存基本的用户信息,并将其加载到ghci中。然后我使用ghci来查看新数据类型的类型签名。我从ghci中复制了类型签名,然后尝试重新加载文件。Ghci抛出了一个错误。
以下是代码和错误。
我的问题是,为什么会出现这个错误。我使用了ghci推断出的类型。
User :: Int -> String -> String -> String -> String -> User
data User = User { userID :: Int,
                   login :: String,
                   password :: String,
                   username :: String,
                   email :: String
                   } deriving (Show)

Prelude> :r User [1 of 1] Compiling User ( User.hs, interpreted )

User.hs:3:0: 类型签名无效 编译失败,未加载任何模块。

2个回答

14

您可以声明值(如函数)的类型,但是您不能使用值的类型声明语法声明数据类型或数据构造函数的类型。实际上,定义数据类型和数据构造函数时已经声明了完整的类型,因此不需要额外的类型声明。因此,只需省略User :: ...行;该行是语法错误,因为仅大写字母U(构造函数)和小写字母名称(值)可以有类型。


5

顺便提一下,如果你想以“类型注释”的方式编写User,可以使用GADT语法:

{-# LANGUAGE GADTs #-}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接