jay*_*hah 1 types typechecking type-alias elm
以下代码有两个类型别名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 )
Run Code Online (Sandbox Code Playgroud)
类型别名就是类型的另一个名称。它不是一种不同的类型。
您可以通过将其包装在自定义类型中来创建不同的类型,但是:
type Name = Name String
type Surname = Surname String
Run Code Online (Sandbox Code Playgroud)
但是,您还必须构建和解构它:
namePrinter : Name -> String
namePrinter (Name n) =
n
k : Name
k = Name "kaba"
j : Surname
j = Surname "jaja"
Run Code Online (Sandbox Code Playgroud)
然后这将无法编译:
main =
Html.text ( "Hello!" ++ namePrinter k ++ namePrinter j )
Run Code Online (Sandbox Code Playgroud)
此外,如果您在单独的模块中定义此类型并且不导出其构造函数(即,仅导出Name, 而不是Name(..)),则您将拥有所谓的不透明类型,它可用于强制执行类型系统无法执行的不变量。例如,您可以强制整数不能为负数。