SML中'a和''a有什么区别?

Wre*_*all 3 polymorphism ml sml

例如:

fun example (a:'a list) : list = a
Run Code Online (Sandbox Code Playgroud)

将签名:

'a list -> 'a list 
Run Code Online (Sandbox Code Playgroud)

如果我以不同的方式定义但具有相同的内容,该怎么办

fun example (a : ''a list) : list = a
Run Code Online (Sandbox Code Playgroud)

它的签名将是:

''a list -> ''a list
Run Code Online (Sandbox Code Playgroud)

有什么不同?

And*_*erg 18

像普通类型变量'a可以用任意类型代替.表单''a是一个所谓的相等类型变量,这意味着它只能被允许在其值上使用相等运算符=(或<>)的类型替换.

例如,这个功能:

fun contains(x, [])    = false
  | contains(x, y::ys) = x = y orelse contains (x, ys)
Run Code Online (Sandbox Code Playgroud)

不能有类型,'a * 'a list -> bool因为它使用相等x.它被赋予更严格的类型''a * ''a list -> bool.

大多数类型的允许平等,但有些却没有,例如real,exn和特别,任何函数类型t -> u.记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等.

旁注:Haskell后来将这个概念概括为类型类的概念,它允许在类型上使用任意用户定义的约束.等式类型变量由Eq类型类替换.

  • 由IEEE定义的浮点上的等式不是等价关系(因为它在NaN和-0上的行为).因此它会破坏泛型相等运算符的各种属性.如果你真的需要IEEE相等,它可以作为'Real.==`.(但是,由于浮点计算不精确,在浮点数上使用相等是一个坏主意.) (3认同)