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

时间:2013-12-07 04:18:39

标签: polymorphism sml ml

例如:

fun example (a:'a list) : list = a

将签名:

'a list -> 'a list 

如果我以不同的方式定义但具有相同的内容,例如

,该怎么办?
fun example (a : ''a list) : list = a

它的签名将是:

''a list -> ''a list

有什么区别?

1 个答案:

答案 0 :(得分:17)

'a这样的普通类型变量可以用任意类型代替。表单''a是所谓的相等类型变量,这意味着它只能由允许使用相等运算符=(或{{}的类型替换。 1}})关于他们的价值观。

例如,这个函数:

<>

不能包含fun contains(x, []) = false | contains(x, y::ys) = x = y orelse contains (x, ys) 类型,因为它在'a * 'a list -> bool上使用了相等性。它被赋予更严格的类型x

大多数类型允许相等,但有些类型不允许,例如''a * ''a list -> boolreal,特别是任何函数类型exn。记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等。

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