类型别名
类型注释可能开始变得很长。如果你有包含许多字段的记录,这可能是一个真正的问题!这是类型别名的核心动力。类型别名是类型的一个较短名称。例如,你可以这样创建一个 User
别名
type alias User =
{ name : String
, age : Int
}
我们可以只说 User
,而不用一直编写整个记录类型。这有助于我们编写更容易阅读的类型注释
-- WITH ALIAS
isOldEnoughToVote : User -> Bool
isOldEnoughToVote user =
user.age >= 18
-- WITHOUT ALIAS
isOldEnoughToVote : { name : String, age : Int } -> Bool
isOldEnoughToVote user =
user.age >= 18
这两个定义是等价的,但是带有类型别名的那个更短,更容易阅读。因此,我们所做的就是为一个长类型建立一个别名。
模型
在设计模型时非常普遍地使用类型别名。当我们学习 Elm 架构时,我们看到了这样的模型
type alias Model =
{ name : String
, password : String
, passwordAgain : String
}
使用类型别名来实现此模型的主要好处在于,当我们编写 update
和 view
函数的类型注释时。编写 Msg -> Model -> Model
比完全展开的版本好多了!它具有添加好处,即我们可以在不需要更改任何类型注释的情况下向模型中添加字段。
记录构造器
当你专门为记录创建类型别名时,它还生成一个记录构造器。因此,如果我们定义一个 User
类型别名,我们可以开始构建这样的记录
[ { "add-type": "User", "input": "type alias User = { name : String, age : Int }" }, { "input": "User", "value": "\u001b[36m<function>\u001b[0m", "type_": "String -> Int -> User" }, { "input": "User \"Sue\" 58", "value": "{ \u001b[37mname\u001b[0m = \u001b[93m\"Sue\"\u001b[0m, \u001b[37mage\u001b[0m = \u001b[95m58\u001b[0m }", "type_": "User" }, { "input": "User \"Tom\" 31", "value": "{ \u001b[37mname\u001b[0m = \u001b[93m\"Tom\"\u001b[0m, \u001b[37mage\u001b[0m = \u001b[95m31\u001b[0m }", "type_": "User" } ]
尝试创建另一个用户或创建一个你自己的类型别名 ⬆️
请注意 record 构造函数中参数的顺序与类型别名中字段的顺序相匹配!
同样,这仅适用于记录。其他类型的类型别名不会生成构造函数。