Мне нужно реализовать метод для возврата общих элементов в двух списках как часть задачи присваивания:
Моя идея заключалась в том, чтобы удалить дубликаты в обоих списках, соединить их и вернуть элементы, которые повторяются в результирующем списке. Я хочу определить логическую функцию, которая проверяет каждый элемент в списке, если они появляются более одного раза. Моя идея состояла в том, чтобы использовать List.fold_left с определенным элементом b в списке и использовать acc, чтобы отслеживать, сколько раз он появляется в списке. Однако у меня есть ошибка здесь:

У меня есть еще одна идея, которая включает в себя сначала сортировку списков. Но список может быть любого типа, поэтому сравнение должно быть реализовано и для новых типов. Или я могу просто использовать < для сравнения значений любого типа?
Вот коды, которые у меня есть до сих пор.
let rec remove (b : 'a) (l : 'a list)=
match l with
| [] -> []
| w::e -> if w=b then remove b e
else w::(remove b e)
let rec removeduplicates (l:'a list)=
match l with
| [] -> []
| w::e -> w::(removeduplicates(remove w e))
let removeduppair (l : 'a list * 'a list)=
let (l1,l2) = l in
(removeduplicates l1, removeduplicates l2)





Это выражение имеет ошибку типа:
if x = b then acc + 1
Проблема в том, что нет части else. Другими словами, он не говорит, каким должно быть значение, когда x не равно b.
Вы можете исправить это, просто добавив часть else.
Немного подробнее: OCaml позволяет исключить часть else, но только если часть then имеет тип unit. В таком случае значение при ложном тесте будет таким же, как и при истинном, а именно () (единственное значение типа единицы измерения).
Это будет ужасно медленный
O(n^2)и ограниченный размером стека. Чтобы сделать это эффективным, у вас есть два варианта: 1) Как вы упомянули: сортировка. Это будетO(n log n). или 2) хэширование.O(n). Создайте Hashtbl, используя элементы в списках в качестве ключей (и () в качестве значения), а затем проверьте, есть ли ключи из первого во втором.