鍵入別名

有時我們想給型別一個更具描述性的名稱。假設我們的應用有一個代表使用者的資料型別:

{ name : String, age : Int, email : String }

我們對使用者的功能具有以下型別的型別簽名:

prettyPrintUser : { name : String, age : Int, email : String } -> String

對於使用者來說,這可能變得非常難以處理,因此讓我們使用型別別名來減小大小併為該資料結構提供更有意義的名稱:

type alias User =
    { name: String
    , age : Int
    , email : String
    }

prettyPrintUser : User -> String

型別別名使得為應用程式定義和使用模型更加清晰:

type alias Model =
    { count : Int
    , lastEditMade : Time
    }

使用 type alias 字面上只是使用你給它的名稱別名。使用上面的 Model 型別與使用 { count : Int, lastEditMade : Time } 完全相同。這是一個示例,顯示別名與底層型別沒有區別:

type alias Bugatti = Int

type alias Fugazi = Int

unstoppableForceImmovableObject : Bugatti -> Fugazi -> Int
unstoppableForceImmovableObject bug fug =
    bug + fug

> unstoppableForceImmovableObject 09 87
96 : Int

記錄型別的型別別名定義建構函式,其中每個欄位按宣告順序具有一個引數。

type alias Point = { x : Int, y : Int }

Point 3 7
{ x = 3, y = 7 } : Point

type alias Person = { last : String, middle : String, first : String }

Person "McNameface" "M" "Namey"
{ last = "McNameface", middle = "M", first = "Namey" } : Person

即使對於相容型別,每個記錄型別別名也有自己的欄位順序。

type alias Person = { last : String, middle : String, first : String }
type alias Person2 = { first : String, last : String, middle : String }

Person2 "Theodore" "Roosevelt" "-"
{ first = "Theodore", last = "Roosevelt", middle = "-" } : Person2

a = [ Person "Last" "Middle" "First", Person2 "First" "Last" "Middle" ]
[{ last = "Last", middle = "Middle", first = "First" },{ first = "First", last = "Last", middle = "Middle" }] : List Person2