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

elm type alias type checking does not happen, Why does it compile?

以下代码有两个类型别名 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 )

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

您可以通过将其包装在自定义类型中来创建独特的类型:

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 这对于强制执行类型系统不能执行的不变量很有用。例如,您可以强制整数不能为负数。