【发布时间】:2014-02-27 10:16:13
【问题描述】:
我在“Learn You a Haskell for Great Good!”一书的118 页上!
上面写着:
ghci> :t Nothing
Nothing :: Maybe a
这是我的问题:
如果我理解正确,Nothing 是一个值,只有具体类型可以有值,但Maybe a 不是具体类型。那怎么会有Nothing这个值呢?
书上还说:
注意 Nothing 的类型是 Maybe a。它的类型是多态的。
多态类型是什么意思?我该如何理解这一点?这与只有具体类型才能有值的规则不矛盾吗?
编辑:
来自本书的PDF版本:
如果一个类型不带任何类型参数,我们就说它是具体的 完全没有(如 Int 或 Bool),或者如果它采用类型参数并且它们是 都填满了(比如Maybe Char)。如果你有一些价值,它的类型是 总是一个具体的类型。
【问题讨论】:
-
很有趣的问题。 Nothing 不是值,而是构造函数。构造函数是一个函数(嗯,不完全是),它是 certain 类型的值。
-
函数是某种类型的值?我该如何理解这一点?您能否更详细地解释一下您的意思?
-
Maybe不是具体类型,不能有值。Maybe a是任何a的具体类型。Nothing是任何a的Maybe a的值。 -
本书将“具体类型”定义为“完全应用的类型构造函数”,或者更正式地说,类型为
*。这似乎是造成所有混乱的原因。根据本书的定义,Maybe a是具体的,而单独的Maybe不是。所以Nothing是Maybe a类型绝对没有问题。话虽这么说,“具体”绝不是一个官方术语,每个人都以不同的方式使用它。 -
这有点微妙,在这方面我远不是最有知识的人,但我相信在 Haskell 底层语言(lambda 演算的一种变体)中,
Nothing是真的是/\a. Maybe a类型,这意味着如果你给它一个具体类型a你会得到一个具体类型Maybe a的值。但是,a类型的这种传递在 Haskell 中是隐含的。