以下代码具有两个类型别名Name
和Surname
。
理想情况下,我认为这不应该编译。为什么会编译?
类型替换是否在涉及类型检查器之前发生?
import Html
type alias Name = String
type alias Surname = String
namePrinter : Name -> Name
namePrinter n =
n
k : Name
k = "kaba"
j : Surname
j = "jaja"
main =
Html.text ( "Hello!" ++ namePrinter k ++ namePrinter j )
类型别名就是该类型别名。这不是其他类型。
您可以通过将其包装为自定义类型来创建不同的类型:
type Name = Name String
type Surname = Surname String
但是您也必须构造和解构它:
namePrinter : Name -> String
namePrinter (Name n) =
n
k : Name
k = Name "kaba"
j : Surname
j = Surname "jaja"
然后将无法编译:
main =
Html.text ( "Hello!" ++ namePrinter k ++ namePrinter j )
此外,如果您在单独的模块中定义此类型并且不导出其构造函数(即,仅使用Name
而不是Name(..)
),则可以使用opaque type来强制执行不变式类型系统无法做到的。例如,您可以强制整数不能为负数。