2012-03-27 67 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沒有子類型,因此將它們都作爲它們的共同超類型,因爲這是對它們最有用的輸入。