Список изменений, который является iput с функцией - PullRequest
0 голосов
/ 31 марта 2020

Доброе утро, у меня проблема с кодированием с использованием ocaml, поэтому мне пришлось кодировать функцию, которая принимает список ввода, а затем добавить в этот список элемент. Но использование этого не влияет на list1, так как я могу это сделать? Спасибо.

  let rec append list1 element list2 = match list2 with 
    []-> list1
    | e::l -> if  ( element = e )  then e :: list1 
              else (append list1 element l)
   ;; 

1 Ответ

1 голос
/ 31 марта 2020

Список неизменен в OCaml, вы не можете это изменить. Вы можете написать функцию append, которая принимает список и возвращает новый список, который добавляет к нему элемент.

Например, здесь есть функция prepend, которая принимает список и элемент и возвращает новый список с заданным элементом, добавленным к переданному списку,

let prepend xs x = x :: xs

append Функция немного сложнее, поскольку списки в OCaml являются односвязными, поэтому их легко добавлять, но сложно добавлять. Для реализации функции append необходим промежуточный список, назовем его acc для аккумулятор . Затем вы go просматриваете каждый элемент списка ввода и добавляете его в аккумулятор. Поскольку вы делаете предварительный запрос, то после того, как список ввода закончится, ваш аккумулятор будет иметь все элементы списка ввода в обратном порядке, т. Е. Первый элемент (он же заголовок) списка acc будет последним элемент списка ввода. Теперь вам осталось добавить элемент, который мы хотим добавить в обратный список acc, и выполнить обратное действие. Вот код скелета для вас

let append xs x = 
   let rec loop xs acc = match xs with
     | ... -> ... in
   loop xs []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...