我最近开始潜入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
有两个构造函数:Nothing
和Just a
(与LHS上应用a
的相同类型变量Maybe
).
希望很清楚它的Just "foo"
类型Maybe String
和Just '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
.
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
被实例化与.
归档时间: |
|
查看次数: |
1476 次 |
最近记录: |