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 )

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

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

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

最新更新