2011-10-30 82 views
10

我不明白爲什麼我從GHCi得到以下回應。是不是Maybe的構造函數?Haskell初學者

Prelude> :t Maybe 

<interactive>:1:1: Not in scope: data constructor `Maybe' 
Prelude> let e = Maybe 5 

<interactive>:1:9: Not in scope: data constructor `Maybe' 
+0

這兩個答案是完全正確的,但我也想指出的是'maybe'(小寫字母m)*爲*一個函數,類型爲'b - >(a - > b) - >也許a - > b':「maybe函數接受一個默認值,一個函數和一個Maybe值,如果Maybe值爲Nothing,返回默認值,否則將函數應用於Just內部的值並返回結果。「 http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog

回答

6

Maybe類型名。該類型的構造函數是JustNothing,因此Maybe類型的實際的形式爲Just 5(對於存在要返回的值的情況)或Nothing(對於空白情況)。

+0

@delnan:是的,已經修復了。不過感謝您的支持。我在想OCaml。 – Chuck

25

Maybetype constructor,它的兩個可能的data constructorsNothingJust。所以你必須說Just 5而不是Maybe 5

> let x = Just 5 
> x 
Just 5 
> let y = Nothing 
> y 
Nothing 
> :type x 
x :: Maybe Integer 
> :type y 
y :: Maybe a 
> :info Maybe 
data Maybe a = Nothing | Just a  -- Defined in Data.Maybe 
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe 
instance Monad Maybe -- Defined in Data.Maybe 
instance Functor Maybe -- Defined in Data.Maybe 
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe 
instance Read a => Read (Maybe a) -- Defined in GHC.Read 
instance Show a => Show (Maybe a) -- Defined in GHC.Show 

Maybe是一種構造,因爲它是用來構建新的類型(結果類型取決於aMaybe a類型),其中這樣的類型可能是Maybe Int(注意,沒有Param類型a了,即所有類型參數都被綁定)。 Just aNothing是數據構造函數,因爲它們用於構造某個類型的實例,例如Just Int會創建Maybe Int的實例。

另一個主要區別是,只能在模式匹配時使用數據構造函數。你不能說:

case foo of 
    Maybe a -> ... 

你不得不說:

case foo of 
    Just a -> ... 
    Nothing -> ... 
+1

看來,閱讀本教程到目前爲止讓我在類型構造函數和數據構造函數之間有點混淆。語法是相同的,根據教程中附帶的段落Just a也是一個類型構造函數(??)參數化類型與其他語言中的「泛型」或「模板」類型相似。參數化類型接受一個或多個類型參數。例如,標準前奏類型Maybe定義如下: data Maybe a = Nothing |只需一個 –

+0

@DavidKramf更新我的答案。如果您仍然發現任何不清楚的東西,請告訴我。 –

+0

@IonuţG. Stan:'b'中的'a'可能與您定義的'a'不同。也許你應該使用變量'x','y'而不是'a','b'來避免碰撞字母? – Nefrubyr