Список рекурсии в функциональном программировании F # - PullRequest
0 голосов
/ 07 сентября 2018

Я пишу рекурсивную функцию move , которая берет два списка и вставляет элементы из первого списка во второй список в обратном порядке.

у нас есть предопределенный тип данных списка

type ilist = E | L of int * ilist

Например:

move L(2, L(3, E)) L(1, L(2, E)) 

даст мне

L(3, L(2, L(1, L(2))))

Я думаю, что у меня есть ошибки синтаксиса с моим кодом. Также не уверен, смогу ли я добавить pre с использованием cons, поскольку это предопределенный тип данных списка. Любая помощь приветствуется!

let rec move l r =
match l with
 | E -> []
 | L(h,E) -> h::r
 | L(h,t) -> move t r

1 Ответ

0 голосов
/ 07 сентября 2018

В вашей функции есть пара синтаксических ошибок и ошибок проверки типов. Вам нужно правильно делать отступы и заключать в скобки аргументы вашего примера вызова. Поскольку вы хотите вернуть существующий список типа ilist, вам также необходимо заменить [] и :: в реализации справа, вашими конструкторами L и E. Решение проблем дает:

let rec move l r =
  match l with
  | E -> E
  | L(h,E) -> L(h, r)
  | L(h,t) -> move t r

move (L(2, L(3, E))) (L(1, L(2, E)))

Это работает, но не совсем правильно. Чтобы заставить это делать то, что вы хотите, вам нужно:

  • В первом случае, если вы вызываете move E (L(1, E)), вы должны получить обратно L(1, E), но ваша реализация просто возвращает E. Вам необходимо вернуть r.
  • В последнем случае вы не используете h, поэтому он будет удален. Вам необходимо добавить это к значению r или результату рекурсивного вызова, используя конструктор L.
  • Вам также не нужен второй случай - если вы все сделаете правильно, первый и последний случаи будут охватывать все необходимые варианты.
...