Как мне создать функцию, которая переворачивает список int в OCaml? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть тип intlist:

type intlist = Nil | Cons of int * intlist

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

Пока у меня есть только

let reverse (l:intlist):intlist = 
match l with
Nil -> Nil
|Cons(a, Nil) -> Cons(a,Nil)

Вот как я склонен создаватьтакого рода функции, так что я написал тривиальную часть (которая предоставлена, на самом деле, может быть, не то, что мне нужно для начала).Любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 09 мая 2018

Вам действительно нужна вспомогательная функция, так как для обращения вам нужно построить еще один список, поэтому вам нужна функция, которая будет повторяться в одном списке при построении другого списка, то есть с двумя аргументами.Фактически, эта вспомогательная функция называется rev_append и она добавляет обратное содержимое одного списка к другому.Но давайте попробуем сделать это с помощью вспомогательной функции, определенной в области действия функции rev:

 let rev xs =
   let rec loop xs ys = match xs with
     | Nil -> ys
     | Cons (x,xs) -> loop xs (Cons (x,ys)) in
   loop xs Nil

Итак, чтобы перевернуть список, мы просто берем каждый элемент списка и помещаем его в другой список.,Поскольку список ведет себя как стек, мы получаем обратный список бесплатно.Это похоже на Ханойские башни, когда вы выбираете элементы из одного списка (башни) и помещаете их в другой, они оказываются в обратном порядке.

...