обратная функция в mylist стандарт мл - PullRequest
0 голосов
/ 30 марта 2012

Я хочу создать функцию, которая переворачивает пользовательский список, но она не работает, мне предложили функцию в предыдущем вопросе, но она использовала другую функцию, я хочу использовать ее без какой-либо внешней функции, я 'Я написал некоторый код, и я был бы признателен за несколько советов о том, как заставить его работать.

datatype 'element mylist = 
  NIL
| CONS of 'element * 'element mylist;

fun reverse (CONS(x, NIL)) = CONS(NIL, x)
  | reverse (CONS(x, xs)) = CONS((reverse xs), CONS(x, NIL));

Я получаю ошибку:

stdIn:89.5-90.60 Error: right-hand-side of clause doesn't agree with function result type [circularity]
  expression:  'Z mylist mylist mylist
  result type:  'Z mylist mylist
  in declaration:
    reverse =
      (fn CONS (<pat>,<pat>) => CONS (<exp>,<exp>)
        | CONS (<pat>,<pat>) => CONS (<exp>,<exp>))

Что не так с кодом?

1 Ответ

2 голосов
/ 30 марта 2012

Вы изменили порядок заголовка и хвоста списка. Вы определили CONS of 'element * 'element mylist, поэтому его следует использовать как CONS(head, tail). Вы используете его как CONS(tail, head) в reverse. Из-за этого два предложения указывают на противоречивые типы для reverse, и вы получаете ошибку. Обратного порядка аргументов недостаточно, чтобы превратить CONS в append функцию.

Ваша обратная функция должна иметь форму с предложениями, которые следуют за конструкторами для типа данных. Одна из возможностей такова:

fun reverse NIL = NIL
  | reverse CONS(x, xs) = (* implementation for CONS *)

Вероятно, немного проще добавить второй аргумент, который вы используете для получения результата. Это должно выглядеть так:

fun reverse'(NIL, result) = result
  | reverse'(CONS(x,xs), result) = (* implementation for CONS *)

и называться как reverse'(lst, NIL).

Я пропустил реализацию предложений CONS, поскольку вы пометили вопрос как домашнее задание.

...