2012-03-27 66 views
3

我最近开始潜入Haskell。它很有趣,但Nothing定义令我感到困惑,不下沉。在GHCI混淆了Haskell的“Nothing”值

Prelude> :t Nothing 
Nothing :: Maybe a 

不宜NothingJust Nothing,为什么Maybe a

回答

19

这里是Maybe类型的定义:

data Maybe a = Nothing | Just a 

此指出,对于某些类型的a,类型Maybe a有两个构造:NothingJust aa是相同类型变量Maybe被施加到在LHS)。

希望很清楚Just "foo"的类型Maybe StringJust 'c'的类型Maybe Char。但是什么类型是Nothing?由于Nothing不包含任何值,因此其构造函数不使用a类型变量,因此没有任何内容将其类型约束为Maybe的特定形式。

这使得它成为一个“多态常量”。 Nothing可用于预期任何类型的上下文中,因为它在所有这些类型中工作得很好。这就是为什么GHCi将其类型简单报告为Maybe aa是一个变量,它可以表示任何类型,并且它所引用的类型将根据使用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

+1

就在我记得刚刚开始的时候,它并没有立即下沉:在'='*左边的大写字母('Maybe')只能在类型签名*中找到,而名称*的右边*只能在代码*中找到。按照惯例,并且由于含义永远不会含糊不清,对于单构造类型,通常类型构造函数将具有与其类型相同的名称。我认为这是令人困惑的操作。 – jberryman 2012-03-27 18:14:02

6

Maybe定义

data Maybe a = Nothing | Just a 

所以Nothing是类型Maybe a的(无参数)值构造,对于所有a,它表示可以属于各种类型Maybe a,是值他们Maybe BoolMaybe [IO (Int,Char)]或不管a是实例化。

4

Maybe被定义为

data Maybe a = Nothing | Just a 

因此,它可以或者是NothingJust aMayba a是类型,而NothingJust a是值构造函数。 Just Nothing可能会被包裹在可能内,即Maybe (Maybe a)

1

考虑斯卡拉,它具有子类型。它相当于Nothing被称为NoneNoneNone,这是亚型Option[a]。斯卡拉相当于JustSome(foo),它有Some[Foo],这是Option[Foo]的子类型。 Haskell没有子类型,因此将它们都作为它们的共同超类型,因为这是对它们最有用的输入。