2017-07-08 122 views
2

我一直在阅读过Richard Feldman's Elm SPA app example,和我看到这样的一些东西examples何时使用类型别名与单值union类型榆树

type Username 
    = Username String 

和我当它有意义的使用类似的东西不知道,一个单值联合类型,与只是一个类型别名是这样的:

type alias Username 
    = String 

什么时候适合只使用一个单值工会与类型使用类型别名?

+1

您显示的示例被称为不透明类型。使用它可以让你从程序的其他部分隐藏实现细节(或者在图书馆或消费者的情况下)。您可以在[Elm package help](http://package.elm-lang.org/help/design-guidelines#keep-tags-and-record-constructors-secret)中阅读更多关于它们的信息(请参阅标题为“保持标签和记录构造函数的秘密“)。 – pzp

回答

5

什么时候合适,没有硬性规定,但我倾向于遵循一些经验法则。让我们使用一个验证函数示例,该示例使用用户名和密码,它们都是字符串值。

在最低的限度,没有任何额外的别名或类型,注释可能是这样的:

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 ... 

如果你想走得更远一步,每次使用它的时候强制类型的明确声明,您能避免错误的类型,因为编译器将捕获mixups:

type Username = Username String 
type Password = Password String 

有了这个定义,你现在必须明确地展开,从而在任何一个用户名或密码的构造函数每次使用它的时候打包的字符串。这对于诸如度量单位这样的概念特别有用,其中这样的概念可能具有avoided the loss of a Mars mission

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