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

问题描述 投票:1回答:1

以下代码具有两个类型别名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 )
types elm typechecking type-alias
1个回答
1
投票

类型别名就是该类型别名。这不是其他类型。

您可以通过将其包装为自定义类型来创建不同的类型:

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来强制执行不变式类型系统无法做到的。例如,您可以强制整数不能为负数。

© www.soinside.com 2019 - 2024. All rights reserved.