键入别名

有时我们想给类型一个更具描述性的名称。假设我们的应用有一个代表用户的数据类型:

{ 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