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

Blu*_*ger 4 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)
Run Code Online (Sandbox Code Playgroud)

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

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

yfe*_*lum 14

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


Log*_*ldo 5

顺便提一下,如果您想在"类型注释"y样式中编写User,可以使用GADT语法执行此操作:

{-# LANGUAGE GADTs #-}

data User where
     User :: Int -> String -> String -> String -> String -> User
Run Code Online (Sandbox Code Playgroud)