構造型別
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 時的邏輯。