我正在学习《Haskell编程原理》这本书,其中有一道练习要求判断以下代码 [稍做修改] 是否合法:
module Test where
type Subject = String
type Verb = String
type Object = String
data Sentence =
Sentence Subject Verb Object
deriving (Eq, Show)
a1 = Sentence "I" "like" "cheese"
a2 = Sentence "I" "scream"
我的初衷是代码会失败,因为在a2
的定义中,Sentence
只有两个参数。但发现 GHCi 能够成功加载该模块。我进行了一些实验,发现我能够输入以下命令:
a3 = a2 "icecream"
如果在GHCi中输入a3
,将会打印Sentence "I" "scream" "icecream"
。而如果我查询a2
的类型,则会得到a2 :: Object -> Sentence
。因此,如果我理解正确的话,a2
的行为就像是一个部分应用的函数。
因此问题是:在所有情况下,类型构造器是否真的只是一个函数(返回类型值)- 与普通函数有所区别,只是它必须以大写字符开头?
:t Just
来进一步确认这一点。 - michidcase mySentence of (Sentence s v o) -> ...
,例如 - 这里Sentence
用于模式匹配,你不能在那里插入一个函数(好吧,有扩展...但在基本层面上你不能)。 - Random Dev