I love using pipelines of combinators to munge data but OCaml’s stdlib is missing some obvious ones such as group_by
/distinct_by
/count_by
. You can write them easily enough in vanilla OCaml using Hashtbl, e.g. Array.distinct_by
:
let distinct_by f xs =
let seen = Hashtbl.create 16 in
let result = ExtArray.empty() in
xs
|> Array.iter (fun x ->
let fx = f x in
if Hashtbl.mem seen fx then () else
( Hashtbl.add seen fx ();
ExtArray.append result x ));
ExtArray.to_array result
but that relies upon polymorphic equality and hashing. If I want to write these kinds of functions using functors I guess I’d use first-class modules to pass a concrete Hashtbl implementation (generated by Hashtbl.Make) into that function. What exactly would that look like?
Furthermore, can I factor out any commonality between equivalent functions for different ordered collections such as List
, Array
, Stack
, Queue
and so on using functors?