我正在尝试在 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)