elm 类型别名类型检查不会发生,为什么要编译?

jay*_*hah 1 types typechecking type-alias elm

以下代码有两个类型别名NameSurname.

理想情况下,我认为这不应该编译。为什么要编译?

类型的替换是否在涉及类型检查器之前发生?

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)

gle*_*nsl 6

类型别名就是类型的另一个名称。它不是一种不同的类型。

您可以通过将其包装在自定义类型中来创建不同的类型,但是:

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(..)),则您将拥有所谓的不透明类型,它可用于强制执行类型系统无法执行的不变量。例如,您可以强制整数不能为负数。