Ошибка SML/NJ: оператор и операнд не согласованы

Я пытаюсь написать функцию contains в 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 list, я хочу, чтобы 'a представлял один и тот же абстрактный тип в обоих экземплярах. Я делаю это совершенно неправильно?


person danbroooks    schedule 09.01.2017    source источник


Ответы (1)


В 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)
person Tomas Petricek    schedule 09.01.2017