SML/NJ Error: operator and operand don't agree

852 views Asked by At

I'm trying to write a function contains in SML/NJ:

fun contains(el: 'a, items: 'a list) =
  if null items
  then false
  else ((hd items) = el) orelse contains(el, tl items)

I'm aware I could probably achieve the same end result using native list functions, but this is for a MOOC that calls for not using any SML/NJ features beyond the basics it has covered thus far. The error I'm getting is:

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

I'm not 100% sure why I can't abstract over 'a in the same way I can in 'a list, I want 'a to represent the same abstracted type in both instances. Am I doing it completely wrong?

1

There are 1 answers

0
Tomas Petricek On BEST ANSWER

In ML, you cannot in general compare values of generic type such as 'a. However, there is a special kind of generic types written ''a, which stands for types that support equality testing using the = operator.

You can actually see that the error message is hinting at this by saying that ''Z * ''Z does not match type 'a * 'a - you explicitly defined the function as generic using 'a, but the compiler would like it to be generic parameter ''Z which allows comparison.

The following should do the trick:

fun contains(el: ''a, items: ''a list) =
  if null items
  then false
  else ((hd items) = el) orelse contains(el, tl items)