Вернуть элементы, общие для обоих списков в Ocaml - PullRequest
0 голосов
/ 26 января 2019

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

У меня есть еще одна идея, которая заключается в том, чтобы сначала отсортировать списки, но список может быть любого типа, следовательно, сравнение должно быть реализовано и для новых типов. Или я могу просто использовать <для сравнения значений любого типа? </p>

Вот коды, которые у меня есть.

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)

1 Ответ

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

Это выражение имеет ошибку типа:

if x = b then acc + 1

Проблема в том, что нет else части. Другими словами, он не говорит, что вы хотите, чтобы значение было, когда х не равен б.

Вы можете исправить это, просто добавив else деталь.

Немного подробнее: OCaml позволяет вам исключить часть else, но только если часть then имеет тип блока. В таком случае значение, когда тест ложен, будет таким же, как и когда оно истинно, а именно () (единственное значение типа блока).

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