SML/NJ 错误:运算符和操作数不一致



我正在尝试在 SML/NJ 中编写一个函数contains

fun contains(el: 'a, items: 'a list) =
  if null items
  then false
  else ((hd items) = el) orelse contains(el, tl items)

我知道我可能会使用本机list函数实现相同的最终结果,但这适用于 MOOC,它要求不使用迄今为止涵盖的基础知识之外的任何 SML/NJ 功能。我得到的错误是:

solution.sml:10.9-10.24 Error: operator and operand don't agree [UBOUND match]
  operator domain: ''Z * ''Z
  operand:         'a * 'a
  in expression:
    hd items = el

我不是 100% 确定为什么我不能像在 'a list 中那样对'a进行抽象,我希望'a在两个实例中表示相同的抽象类型。我做得完全错了吗?

在 ML 中,您通常不能比较泛型类型的值,例如 'a 。但是,有一种特殊的泛型类型编写''a,它代表支持使用 = 运算符进行相等性测试的类型。

您实际上可以看到错误消息通过说''Z * ''Z与类型 'a * 'a 不匹配来暗示这一点 - 您使用 'a 显式将函数定义为泛型,但编译器希望它是允许比较的泛型参数''Z

以下应该可以解决问题:

fun contains(el: ''a, items: ''a list) =
  if null items
  then false
  else ((hd items) = el) orelse contains(el, tl items)

最新更新