我最近開始潛入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