Allan Jiang
Allan Jiang

Reputation: 11351

Find unique elements in a list in OCaml

I am working on a project with OCaml and there are some problems regarding to arrays that I am not sure with. I am not allowed to use the List module, so please give me some idea or suggestion with my works.

First, I already implemented a function 'a list -> 'a list called uniq that return a list of the uniq elements in an array, for example uniq [5;6;5;4] => [6;5;4]

Here is my implementation:

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 sure this is a correct implementation, can someone give me some suggestion or correctness?

Upvotes: 3

Views: 9280

Answers (1)

pad
pad

Reputation: 41290

You functions are syntactically incorrect for various reasons:

  • uniq_help takes two elements so you have to invoke it using uniq_help t n, not uniq_help(t, n) and the like.
  • an if/else expression should have the form of if cond then expr1 else expr2.
  • to use uniq_help locally in uniq, you need an in keyword.

After fixing syntax errors, your function looks like:

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

However, to be sure that each element is unique in the list, you have to check uniqueness for all of its elements. One quick fix could be:

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

Upvotes: 8

Related Questions