例如:
fun example (a:'a list) : list = a
将签名:
'a list -> 'a list
如果我以不同的方式定义但具有相同的内容,例如
,该怎么办?fun example (a : ''a list) : list = a
它的签名将是:
''a list -> ''a list
有什么区别?
答案 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 -> bool
,real
,特别是任何函数类型exn
。记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等。
旁注:Haskell后来将这个概念概括为 type classes 的概念,它允许在类型上使用任意用户定义的约束。等式类型变量由t -> u
类型类替换。