我不明白爲什麼我從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'
我不明白爲什麼我從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'
Maybe
是類型名。該類型的構造函數是Just
和Nothing
,因此Maybe類型的實際值的形式爲Just 5
(對於存在要返回的值的情況)或Nothing
(對於空白情況)。
@delnan:是的,已經修復了。不過感謝您的支持。我在想OCaml。 – Chuck
Maybe
是type constructor,它的兩個可能的data constructors是Nothing
和Just
。所以你必須說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
是一種構造,因爲它是用來構建新的類型(結果類型取決於a
在Maybe a
類型),其中這樣的類型可能是Maybe Int
(注意,沒有Param類型a
了,即所有類型參數都被綁定)。 Just a
和Nothing
是數據構造函數,因爲它們用於構造某個類型的實例,例如Just Int
會創建Maybe Int
的實例。
另一個主要區別是,只能在模式匹配時使用數據構造函數。你不能說:
case foo of
Maybe a -> ...
你不得不說:
case foo of
Just a -> ...
Nothing -> ...
看來,閱讀本教程到目前爲止讓我在類型構造函數和數據構造函數之間有點混淆。語法是相同的,根據教程中附帶的段落Just a也是一個類型構造函數(??)參數化類型與其他語言中的「泛型」或「模板」類型相似。參數化類型接受一個或多個類型參數。例如,標準前奏類型Maybe定義如下: data Maybe a = Nothing |只需一個 –
@DavidKramf更新我的答案。如果您仍然發現任何不清楚的東西,請告訴我。 –
@IonuţG. Stan:'b'中的'a'可能與您定義的'a'不同。也許你應該使用變量'x','y'而不是'a','b'來避免碰撞字母? – Nefrubyr
這兩個答案是完全正確的,但我也想指出的是'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