【发布时间】:2013-12-24 14:36:00
【问题描述】:
例如:
fun example (a:'a list) : list = a
将有以下签名:
'a list -> 'a list
如果我用不同的方式定义它,但内容相同,比如
fun example (a : ''a list) : list = a
它的签名将是:
''a list -> ''a list
有什么区别?
【问题讨论】:
标签: 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
有什么区别?
【问题讨论】:
标签: polymorphism sml ml
像'a 这样的普通类型变量可以替换为任意类型。 ''a 形式是一个所谓的相等类型 变量,这意味着它只能被允许在其上使用相等运算符=(或<>)的类型替换价值观。
例如这个函数:
fun contains(x, []) = false
| contains(x, y::ys) = x = y orelse contains (x, ys)
不能有类型'a * 'a list -> bool,因为它在x 上使用相等。它被赋予了更严格的类型''a * ''a list -> bool。
大多数类型允许相等,但有些则不允许,例如 real、exn,尤其是任何函数类型 t -> u。如果记录、元组或数据类型等组合类型的所有组件都允许相等,则它们承认相等。
旁注:Haskell 后来将此概念推广到其类型类 的概念,它允许对类型进行任意用户定义的此类约束。相等类型变量被Eq 类型类替换。
【讨论】:
Real.==。 (但是,由于浮点计算的不精确性,在实践中对浮点使用相等是一个坏主意。)
eqtype 关键字,该关键字可用于签名。它的目的是断言出现在签名中的这种带注释的类型是 equality 类型,正如 Andrea 所解释的那样。