我一直在阅读Richard Feldman的Elm SPA应用示例,并且看到了很多类似这样的示例:
type Username
= Username String
我不确定何时使用单值联合类型会有意义,相对于像这样的类型别名:
type alias Username
= String
什么时候使用单值联合类型比使用类型别名更合适?
我一直在阅读Richard Feldman的Elm SPA应用示例,并且看到了很多类似这样的示例:
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