Functional programming SML/NJ错误:运算符和操作数don';我不同意

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.

我试图在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.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)