Mark S.
Mark S.

Reputation: 31

Combining two functions in OCaml

My task is to remove the duplicates from a list. To do that I have to first sort the list.

I have written the function that sorts the list and the one that remove the duplicates(once they are sorted) but I don't know how to combine them.

Example:

input: [4;5;2;2;1;3;3]

output: [1;2;3;4;5]

let rec setify = function
    | [] -> []
    | x :: l -> insert x (setify l)
  and insert elem = function
    | [] -> [elem]
    | x :: l -> if elem < x then elem :: x :: l
                else x :: insert elem l;;

let rec rem =function 
|[] -> [] 
| x :: []-> x :: [] 
| x :: y :: rest -> if x = y then rem (y :: rest) 
                    else x :: rem (y :: rest) ;;

Upvotes: 0

Views: 1836

Answers (1)

Pascal Cuoq
Pascal Cuoq

Reputation: 80335

You want to make the function that takes a list, creates the sorted list, and deduplicates that. In other words, you want:

let task list =
  let sorted_list = setify list in
  rem sorted_list

It is possible to do this in arbitrarily more complicated ways, but the above is one straightforward, one-action-per-line version. Since the phrasing of the title of your question invites it, here is one of the more sophisticated ways:

(* it's possible to write a generic combinator of functions, that takes two functions f and g *)
let combine f g =
(* and returns a function *)
fun x ->
(* that maps x to f(g(x)) *)
f (g x)

(* this function is typed as:
val combine : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
*)

(* the task can then be expressed as the combination of setify and rem: *)
let task = combine rem setify

Don't use this style unless something is actually gained from it. Most of the times it only makes programs less readable and slower with no corresponding benefit. *)

Upvotes: 1

Related Questions