構造型別

type alias 關鍵字組合為型別提供了新名稱,但隔離的 type 關鍵字宣告瞭一種新型別。讓我們來看看這些型別中最基本的一種: Maybe

type Maybe a
    = Just a
    | Nothing

首先要注意的是 Maybe 型別是使用 a型別變數宣告的。需要注意的第二件事是管道字元|,它表示。換句話說,型別 Maybe a 的東西要麼 Just a Nothing

當你編寫上面的程式碼時,JustNothing 作為值建構函式進入作用域,Maybe 作為型別建構函式進入作用域。這些是他們的簽名:

Just : a -> Maybe a

Nothing : Maybe a

Maybe : a -> Maybe a -- this can only be used in type signatures

由於型別變數 a,任何型別都可以包裹Maybe 型別。因此,Maybe IntMaybe (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 時的邏輯。