何时在 Elm 中使用类型别名与单值联合类型
When to use type alias vs. single-value union type in Elm
我已经阅读了 Richard Feldman's Elm SPA app example, and I'm seeing a number of examples 篇这样的文章:
type Username
= Username String
而且我不确定什么时候使用类似的东西,单值联合类型,而不是像这样的类型别名:
type alias Username
= String
何时使用单值联合类型与仅使用类型别名比较合适?
对于什么时候合适,没有硬性规定,但我倾向于遵循一些经验法则。让我们使用一个采用用户名和密码的身份验证函数示例,两者都是字符串值。
在没有任何额外别名或类型的情况下,注释至少可以是这样的:
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 解码、编码等,这可能会变得乏味。您需要为您的团队和项目找到合适的平衡点。
我已经阅读了 Richard Feldman's Elm SPA app example, and I'm seeing a number of examples 篇这样的文章:
type Username
= Username String
而且我不确定什么时候使用类似的东西,单值联合类型,而不是像这样的类型别名:
type alias Username
= String
何时使用单值联合类型与仅使用类型别名比较合适?
对于什么时候合适,没有硬性规定,但我倾向于遵循一些经验法则。让我们使用一个采用用户名和密码的身份验证函数示例,两者都是字符串值。
在没有任何额外别名或类型的情况下,注释至少可以是这样的:
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 解码、编码等,这可能会变得乏味。您需要为您的团队和项目找到合适的平衡点。