何时在Elm中使用类型别名(type alias)和单值联合类型(single-value union type)?

3

我一直在阅读Richard Feldman的Elm SPA应用示例,并且看到了很多类似这样的示例

type Username
    = Username String

我不确定何时使用单值联合类型会有意义,相对于像这样的类型别名:

type alias Username
    = String

什么时候使用单值联合类型比使用类型别名更合适?

1
你展示的例子被称为不透明类型。使用它可以让你隐藏程序的其他部分(或在库的情况下是消费者)对实现细节的了解。你可以在 Elm 包帮助 中阅读更多关于它们的内容(参见“保持标签和记录构造函数的机密性”一节)。 - pzp
1个回答

8

什么时候使用注释没有硬性规定,但我通常遵循一些经验法则。让我们以一个身份验证函数示例为例,该函数接受用户名和密码,这两个值都是字符串。

最基本的情况下,没有任何其他别名或类型,注释可以是这样的:

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

基于这个定义,每次使用它时,您现在必须明确地解包并打包字符串到“用户名”或“密码”构造函数中。这对于像度量单位这样的东西特别有用,其中这样的概念可能已经避免了火星任务的损失
正如您在Richard的示例中看到的那样,选择完整类型和类型构造函数的路线意味着您需要单独的样板文件函数进行json解码、编码等操作,这可能会变得乏味。您需要为您的团队和项目找到正确的平衡点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接