Поиск общих элементов без дубликатов в двух списках с помощью OCaml - PullRequest
0 голосов
/ 30 января 2019

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

let rec common twolists =
    match twolists with
    | (x, y) ->
         match x with
         | [] -> []
         | s :: ss ->
             if memberof (s, y) then
                 s :: common (ss, y)
             else 
                 common (ss, y)
;;

Я нашел все общий элементв 2 списках, но я не знаю, как это сделать без дубликатов.

1 Ответ

0 голосов
/ 30 января 2019

Одной из идей было бы заменить это выражение:

s :: common (ss, y)

чем-то более сложным.

Если s уже является членом common (ss, y), вы этого не сделаетехочу добавить это снова.Таким образом, вы можете заменить это выражение двумя случаями в зависимости от того, есть ли уже s.

Для этого вы, вероятно, захотите использовать let:

let rest = common (ss, y) in
. . .

(обратите внимание, что еслиэто был производственный код, в котором списки могут быть длинными, вы бы хотели избежать повторного вызова memberof. Возможно, вы в конечном итоге будете использовать деревья. Т.е. множества. Тогда результатом будет совершенно прямое пересечение множеств.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...