混淆Haskell"没什么"的价值

ykm*_*m29 3 haskell maybe

我最近开始潜入Haskell.它非常有趣,但是Nothing我的定义让人感到困惑并且没有陷入其中.在GHCI上

Prelude> :t Nothing
Nothing :: Maybe a
Run Code Online (Sandbox Code Playgroud)

Nothing应该Just Nothing,为什么Maybe a

bit*_*ket 19

以下是Maybe类型的定义:

data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)

这表明对于某些类型a,类型Maybe a有两个构造函数:NothingJust a(与LHS上应用a的相同类型变量Maybe).

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

这使它成为"多态常数".Nothing可以在Maybe期望任何类型的上下文中使用,因为它在所有类型中都同样有效.这就是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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,Just Nothing :: Maybe (Maybe a); 它是Maybe另一个包裹着的Maybe.


Dan*_*her 6

Maybe 被定义为

data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)

因此Nothing是一种类型的(无参数)值构造Maybe a,对于所有a,并且其表示可以属于各种类型的值Maybe a,是它们Maybe Bool,Maybe [IO (Int,Char)]或任何a被实例化与.