Найти уникальные элементы в списке в OCaml - PullRequest
3 голосов
/ 27 марта 2012

Я работаю над проектом с OCaml, и есть некоторые проблемы с массивами, в которых я не уверен. Мне не разрешено использовать модуль List, поэтому, пожалуйста, дайте мне идею или предложение с моими работами.

Во-первых, я уже реализовал функцию 'a list -> 'a list с именем uniq, которая возвращает список элементов uniq в массиве, например uniq [5;6;5;4] => [6;5;4]

Вот моя реализация:

let rec uniq x =
let rec uniq_help l n = 
    match l with
        [] -> []
    |   h :: t -> uniq_help t, n if (n = h) else (h :: (uniq_help(t, n)))
match x with
    [] -> []
|   h::t -> uniq_help t, h
;;

Я не уверен, что это правильная реализация, кто-то может дать мне какое-то предложение или правильность?

1 Ответ

8 голосов
/ 27 марта 2012

Ваши функции синтаксически некорректны по разным причинам:

  • uniq_help принимает два элемента, поэтому вы должны вызывать его, используя uniq_help t n, а не uniq_help(t, n) и т. П.
  • выражение if/else должно иметь вид if cond then expr1 else expr2.
  • для локального использования uniq_help в uniq необходимо ключевое слово in.

После исправления синтаксических ошибок ваша функция выглядит следующим образом:

let rec uniq x =
  let rec uniq_help l n = 
    match l with
    | [] -> []
    | h :: t -> if n = h then uniq_help t n else h::(uniq_help t n) in
  match x with
  | [] -> []
  | h::t -> uniq_help t h

Однако, чтобы быть уверенным, что каждый элемент уникален в списке, вы должны проверить уникальность всех его элементов. Одним из быстрых решений может быть:

let rec uniq x =
     (* uniq_help is the same as above *)
     match x with
     | [] -> []
     | h::t -> h::(uniq_help (uniq t) h)
...