【发布时间】:2021-05-26 09:49:22
【问题描述】:
我正在阅读“Haskell Programming from first principle”,并找到了一个练习,询问以下 [此处稍微编辑的代码] 是否有效:
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"
和 a3(输入 GHCi)将打印 Sentence "I" "scream" "icecream"。另外,如果我查询 a2 的类型,我会得到 a2 :: Object -> Sentence。所以如果我理解正确的话,a2 的行为就像一个部分应用的函数。
因此问题是:在所有情况下,类型构造函数真的只是一个函数(返回一个类型值)吗?与“普通”函数的区别仅在于它必须以大写字符开头?
【问题讨论】:
-
(构造部分)的一部分是 是的 - 但您也可以将它们用于模式匹配,当然它不再是一个函数;)
-
这是一个你描述是的意义上的功能。您可以通过例如进一步确认这一点在 ghci 中输入
:t Just。 -
@Carsten 我还没有在模式匹配方面做很多事情,但据我所知,我们可以在定义函数时进行模式匹配(与函数有关)以及何时定义一个类实例(与类型有关)。您能否进一步解释或给我一个参考,说明它们在模式匹配方面有何不同?谢谢
-
@michid 那么有什么意义它是 not 函数,或者我可以对类型构造函数做任何我可以对函数做的事情吗?
-
好吧,如果你这样做
case mySentence of (Sentence s v o) -> ...例如 - 这里Sentence用于模式匹配,你不能在那里插入函数(当然有扩展......但在基本层面上你不能)
标签: function haskell types algebraic-data-types custom-data-type