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

时间:2017-01-09 23:00:55

标签: functional-programming smlnj type-parameter

我正在尝试在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的方式抽象'a list,我希望'a代表两者中相同的抽象类型实例。我完全错了吗?

1 个答案:

答案 0 :(得分:1)

在ML中,您通常无法比较泛型类型的值,例如$('#map').vectorMap( { map: 'dk_mill', series: { regions: [{ values: gdpData, scale: ['#C8EEFF', '#0071A4'], normalizeFunction: 'polynomial' }] }, onRegionTipShow: function(e, el, code){ el.html(el.html()+'(GDP - '+gdpData[code]+')'); } }); 。但是,有一种特殊类型的通用类型'a,它代表使用''a运算符支持相等性测试的类型。

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

以下应该可以解决问题:

''Z