为什么类型'a'和'Z在SML中不匹配?

Tom*_*son 3 sml

我有以下递归函数:

fun tester (f:'a -> 'b, tl:(string * 'a * 'b) list) =
    case tl of
    [] => []
     | (t, c, e)::rest => 
       let val tr = f (c)
       in
           if tr <> (e)
           then ((t), (e), tr)::(tester (f, rest))
           else tester (f, rest)
       end;
Run Code Online (Sandbox Code Playgroud)

加载时我得到"错误:运算符和操作数不同意[UBOUND match]":

lec1test.sml:17.5-19.26 Error: operator and operand don't agree [UBOUND match]
  operator domain: ''Z * ''Z
  operand:         'b * 'Y
  in expression:
    tr <> e

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20
Run Code Online (Sandbox Code Playgroud)

我已经发现我认为它与tr的泛型绑定有关,但我不明白为什么这是一个问题.我正在分配tr函数的值f,返回'b.然后我将结果与元组中的最后一个值进行比较,该值也是类型'b.有人能解释为什么这会给我一个错误吗?

And*_*erg 10

并非所有类型的支持运营商的平等=<>,也就是所谓的平等类型.例如,int或者是string list或者bool * unit是相等类型,但是例如函数类型t -> u永远不会,因为没有合理的(可判定的)比较函数的方法.

多态类型的值'a也不是相等类型,因为类型变量可以通过任何类型实例化.要将多态类型限制为相等类型,您需要编写带有双重刻度的类型变量,例如''a.

在您的情况下,将第一行更改为

fun tester (f : ''a -> ''b,  tl : (string * ''a * ''b) list) =
Run Code Online (Sandbox Code Playgroud)

应该为你解决.