使用推断类型的Haskell类型错误

时间:2010-01-11 13:10:20

标签: haskell types

我创建了一个数据类型来保存基本用户信息并将其加载到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)
  

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

     

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

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

顺便提一下,如果您想以“类型注释”样式编写用户,可以使用GADT语法执行此操作:

{-# LANGUAGE GADTs #-}

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