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

type Username
    = Username String

我不确定何时使用这样的东西,单值联合类型,而仅仅是这样的类型别名才有意义:

type alias Username
    = String

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

===============>>#1 票数: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构造函数中。 这对于诸如度量单位之类的事情尤其有用,因为这样的概念本可以避免火星任务的损失

正如您在Richard的示例中看到的那样,采用完整类型和类型构造函数的路由意味着您需要用于json解码,编码等的单独样板函数,这可能会很乏味。 您需要为您的团队和项目找到合适的平衡点。

  ask by neurodynamic translate from so

未解决问题?本站智能推荐: