榆树类型别名类型检查不会发生,为什么要编译?
elm type alias type checking does not happen, Why does it compile?
以下代码有两个类型别名 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 这对于强制执行类型系统不能执行的不变量很有用。例如,您可以强制整数不能为负数。
以下代码有两个类型别名 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 这对于强制执行类型系统不能执行的不变量很有用。例如,您可以强制整数不能为负数。