Functional programming SML/NJ错误:运算符和操作数don';我不同意
我试图在SML/NJ中编写一个函数Functional programming SML/NJ错误:运算符和操作数don';我不同意,functional-programming,smlnj,type-parameter,Functional Programming,Smlnj,Type Parameter,我试图在SML/NJ中编写一个函数包含: 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.
包含:
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
在这两个实例中表示相同的抽象类型。我这样做完全错了吗?在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)