【问题标题】:elm type alias type checking does not happen, Why does it compile?elm type alias 类型检查没有发生,为什么会编译?
【发布时间】:2020-04-12 15:28:50
【问题描述】:

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

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

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

    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的东西,它可以用来强制执行类型系统不能的不变量。例如,您可以强制整数不能为负数。

    【讨论】:

    • 那么在类型检查出现之前,类型别名(如预处理器或其他东西)是否会发生类型替换?
    • 我认为将其视为别名更容易,即引用同一事物的多个名称,而不是将其视为类型替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2020-02-08
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多