类型别名

类型注释可能开始变得很长。如果你有包含许多字段的记录,这可能是一个真正的问题!这是类型别名的核心动力。类型别名是类型的一个较短名称。例如,你可以这样创建一个 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
  }

使用类型别名来实现此模型的主要好处在于,当我们编写 updateview 函数的类型注释时。编写 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 构造函数中参数的顺序与类型别名中字段的顺序相匹配!

同样,这仅适用于记录。其他类型的类型别名不会生成构造函数。

匹配 "" 的结果

    没有与 "" 匹配的结果