何时在Elm中使用类型别名与单值联合类型

时间:2017-07-08 14:15:54

标签: elm type-alias union-types

我一直在阅读Richard Feldman's Elm SPA app example,我看到了很多examples这样的事情:

type Username
    = Username String

并且我不确定何时使用类似的东西,单值联合类型,而不是像这样的类型别名:

type alias Username
    = String

何时使用单值联合类型而不仅仅使用类型别名?

1 个答案:

答案 0 :(得分:6)

在适当的时候没有严格的规则,但我倾向于遵循一些经验法则。让我们使用一个带有用户名和密码的身份验证函数示例,两者都是字符串值。

至少,没有任何其他别名或类型,注释可以是:

authenticate : String -> String -> Bool

鉴于该注释,它不清楚哪个参数是用户名,哪个是密码。我们可以通过使用类型别名来提高可读性:

type alias Username = String
type alias Password = String

authenticate : Username -> Password -> Bool

这对我的软件包的消费者来说更好,但类型别名不会让你不小心交换调用代码中的参数。例如,这个有问题的函数会编译:

login : Username -> Password -> Bool
login username password =
    if authenticate password username then ...

如果你想更进一步并在每次使用时强制显式声明类型,你可以避免这种类型的错误,因为编译器会捕获混合:

type Username = Username String
type Password = Password String

使用该定义,您每次使用时都必须在Username或Password构造函数中显式解包和打包字符串。这对于像测量单位这样的事情尤其有用,其中这样的概念可能具有avoided the loss of a Mars mission

正如您在Richard的例子中所看到的,走完整类型和类型构造函数的路径意味着您需要单独的样板函数来进行json解码,编码等,这可能会变得乏味。您需要为您的团队和项目找到合适的平衡点。