我正在尝试在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
代表两者中相同的抽象类型实例。我完全错了吗?
答案 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