我最近开始潜入Haskell。它很有趣,但Nothing
定义令我感到困惑,不下沉。在GHCI混淆了Haskell的“Nothing”值
Prelude> :t Nothing
Nothing :: Maybe a
不宜Nothing
是Just Nothing
,为什么Maybe a
?
我最近开始潜入Haskell。它很有趣,但Nothing
定义令我感到困惑,不下沉。在GHCI混淆了Haskell的“Nothing”值
Prelude> :t Nothing
Nothing :: Maybe a
不宜Nothing
是Just Nothing
,为什么Maybe a
?
这里是Maybe
类型的定义:
data Maybe a = Nothing | Just a
此指出,对于某些类型的a
,类型Maybe a
有两个构造:Nothing
和Just a
(a
是相同类型变量Maybe
被施加到在LHS)。
希望很清楚Just "foo"
的类型Maybe String
和Just 'c'
的类型Maybe Char
。但是什么类型是Nothing
?由于Nothing
不包含任何值,因此其构造函数不使用a
类型变量,因此没有任何内容将其类型约束为Maybe
的特定形式。
这使得它成为一个“多态常量”。 Nothing
可用于预期任何类型的上下文中,因为它在所有这些类型中工作得很好。这就是为什么GHCi将其类型简单报告为Maybe a
:a
是一个变量,它可以表示任何类型,并且它所引用的类型将根据使用Nothing
值的上下文进行推理来确定。但是当你自己给Nothing
时,没有关于它的具体类型的额外线索,所以你只能看到这个变量。
> :t Nothing
Nothing :: Maybe a
> :t (Nothing :: Maybe Int)
(Nothing :: Maybe Int) :: Maybe Int
> :t (Nothing :: Maybe Char)
(Nothing :: Maybe Char) :: Maybe Char
而且顺便说一下,Just Nothing :: Maybe (Maybe a)
;这是一个Maybe
裹在另一个Maybe
。
Maybe
定义
data Maybe a = Nothing | Just a
所以Nothing
是类型Maybe a
的(无参数)值构造,对于所有a
,它表示可以属于各种类型Maybe a
,是值他们Maybe Bool
,Maybe [IO (Int,Char)]
或不管a
是实例化。
Maybe
被定义为
data Maybe a = Nothing | Just a
因此,它可以或者是Nothing
或Just a
。 Mayba a
是类型,而Nothing
和Just a
是值构造函数。 Just Nothing
可能会被包裹在可能内,即Maybe (Maybe a)
。
考虑斯卡拉,它具有子类型。它相当于Nothing
被称为None
。 None
有None
,这是亚型的Option[a]
。斯卡拉相当于Just
是Some(foo)
,它有Some[Foo]
,这是的Option[Foo]
的子类型。 Haskell没有子类型,因此将它们都作为它们的共同超类型,因为这是对它们最有用的输入。
就在我记得刚刚开始的时候,它并没有立即下沉:在'='*左边的大写字母('Maybe')只能在类型签名*中找到,而名称*的右边*只能在代码*中找到。按照惯例,并且由于含义永远不会含糊不清,对于单构造类型,通常类型构造函数将具有与其类型相同的名称。我认为这是令人困惑的操作。 – jberryman 2012-03-27 18:14:02