首页 文章

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

提问于
浏览
2

例如:

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

将签名:

'a list -> 'a list

如果我以不同的方式定义但具有相同的内容,该怎么办

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

它的签名将是:

''a list -> ''a list

有什么不同?

1 回答

  • 16

    '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 .

    大多数类型允许相等,但有些不允许,例如 realexn ,特别是任何函数类型 t -> u . 记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等 .

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

相关问题