2012-03-26 6 views
2

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

Во-первых, я уже реализована функция '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 
;; 

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

+0

Код, указанный здесь, не компилируется для меня. Похоже, что вы где-то отсутствуете. Способ определения локального символа, такого как 'uniq_help', -' let local = в '. –

+0

Они не массивы в OCaml, они списки. Массивы подразумевают изменчивое состояние, что не так, как списки в ocaml работают без явного использования чего-либо из модуля Array. –

ответ

6

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

  • uniq_help принимает два элемента, так что вы должны вызвать его с помощью uniq_help t n, не uniq_help(t, n) и тому подобные.
  • a 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) 
+0

Для моего понимания, unip_help добавляет последнее вхождение элемента в список, но последнее вхождение также будет добавлено несколько раз в список !!! – overloading

Смежные вопросы