例如:
fun example (a:'a list) : list = a
将签名:
'a list -> 'a list
如果我以不同的方式定义但具有相同的内容,该怎么办
fun example (a : ''a list) : list = a
它的签名将是:
''a list -> ''a list
有什么不同?
像 'a 这样的普通类型变量可以用任意类型代替 . 表单 ''a 是一个所谓的相等类型变量,这意味着它只能被允许在其值上使用相等运算符 = (或 <> )的类型替换 .
'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 .
'a * 'a list -> bool
x
''a * ''a list -> bool
大多数类型允许相等,但有些不允许,例如 real , exn ,特别是任何函数类型 t -> u . 记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等 .
real
exn
t -> u
旁注:Haskell后来将这个概念概括为类型类的概念,它允许在类型上使用任意用户定义的约束 . 等式类型变量由 Eq 类型类替换 .
Eq
1 回答
像
'a
这样的普通类型变量可以用任意类型代替 . 表单''a
是一个所谓的相等类型变量,这意味着它只能被允许在其值上使用相等运算符=
(或<>
)的类型替换 .例如,这个功能:
不能有
'a * 'a list -> bool
类型,因为它在x
上使用相等 . 它给出了更具限制性的类型''a * ''a list -> bool
.大多数类型允许相等,但有些不允许,例如
real
,exn
,特别是任何函数类型t -> u
. 记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等 .旁注:Haskell后来将这个概念概括为类型类的概念,它允许在类型上使用任意用户定义的约束 . 等式类型变量由
Eq
类型类替换 .