例如:
fun example (a:'a list) : list = a
将有以下签名:
'a list -> 'a list
如果我定义不同但内容相同怎么办,例如
fun example (a : ''a list) : list = a
它的签名是:
''a list -> ''a list
有什么不同?
一个普通类型变量,例如'a
可以用任意类型替换。表格''a
是一个所谓的平等型变量,这意味着它只能被允许使用相等运算符的类型替换=
(or <>
)关于他们的价值观。
例如这个函数:
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
。如果记录、元组或数据类型等组合类型的所有组件都承认相等,则它们也承认相等。
旁注:哈斯克尔后来将这个概念推广到它的概念类型类,它允许对类型进行任意用户定义的此类约束。相等类型变量被替换为Eq
类型类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)