構造型別
type alias
關鍵字組合為型別提供了新名稱,但隔離的 type
關鍵字宣告瞭一種新型別。讓我們來看看這些型別中最基本的一種: Maybe
type Maybe a
= Just a
| Nothing
首先要注意的是 Maybe
型別是使用 a
的型別變數宣告的。需要注意的第二件事是管道字元|
,它表示或。換句話說,型別 Maybe a
的東西要麼 Just a
或 Nothing
。
當你編寫上面的程式碼時,Just
和 Nothing
作為值建構函式進入作用域,Maybe
作為型別建構函式進入作用域。這些是他們的簽名:
Just : a -> Maybe a
Nothing : Maybe a
Maybe : a -> Maybe a -- this can only be used in type signatures
由於型別變數 a
,任何型別都可以包裹Maybe
型別。因此,Maybe Int
,Maybe (List String)
或 Maybe (Maybe (List Html))
都是有效的型別。當用 case
表示式解構任何 type
值時,必須考慮該型別的每個可能的例項化。對於 Maybe a
型別的值,你必須同時考慮 Just a
case 和 Nothing
case:
thing : Maybe Int
thing =
Just 3
blah : Int
blah =
case thing of
Just n ->
n
Nothing ->
42
-- blah = 3
嘗試在 case
表示式中沒有 Nothing
子句編寫上面的程式碼:它不會編譯。這就是使 Maybe
型別建構函式成為表達可能不存在的值的一種很好的模式,因為它迫使你處理值為 Nothing
時的邏輯。