обратная функция и добавление функции в пользовательский список стандартных мл - PullRequest
1 голос
/ 29 марта 2012

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

код типа данных:

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

и написанные мной функции:

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

Я также хочу написать функцию, которая добавляет 2 значения mylist, у меня есть несколько случаев, но это не сработало, хотя из следующего:

fun append NIL = fn NIL => NIL
  | append NIL = fn (CONS(x, xs)) => CONS(x, xs)
  | append (CONS(x, xs)) = fn NIL => CONS(x, xs)
  | append (CONS(x, xs)) = fn (CONS(y, ys)) => append xs (CONS(y, ys));

но он не работает, выдает ошибку, что не так с моим кодом?

Спасибо

Ответы [ 2 ]

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

Классический способ перевернуть список - использовать хвостовую рекурсивную вспомогательную функцию, например так:

fun helper accumulator NIL = accumulator
  | helper accumulator CONS(x, xs) = helper CONS(x, accumulator) xs

Теперь все наоборот:

val reverse = helper NIL
1 голос
/ 29 марта 2012

В функции append вы допустили две ошибки:

  • Дублированные случаи сопоставления с образцами append NIL и append (CONS(x, xs)).
  • Неисчерпывающее сопоставление с образцом в лямбда-выраженииfn NIL => ... и т. П.

Логика append также неверна.Это должно быть что-то вроде:

fun append NIL ys = ys
  | append (CONS(x, xs)) ys = CONS(x, append xs ys)

Функция reverse имеет ошибку несоответствия типов.Поскольку reverse xs является списком, CONS(reverse xs, x) не проверяет тип.Быстрое решение - использовать append для реализации reverse:

fun reverse NIL = NIL
  | reverse (CONS(x, xs)) = append (reverse xs) (CONS(x, NIL))
...