I’'m quite new to OCaml, and I’m trying the Exercises section on the site. Although it is really nice to use
utop to have a quick view for what some code can do, I’m trying to extend some of those exercises into a project with some ideas to test.
I’m currently testing the
modified run length encoding exercise, and trying to add some “pretty printing” with
ppx_deriving on top of that.
For now my code looks something like this:
type 'a rle = | One of 'a | Many of int * 'a [@@deriving show] let pp = pp_rle Format.pp_print_string let show = show_rle Format.pp_print_string let encode l = let tup c e = if c = 1 then One e else Many (c, e) in let rec f c acc = function |  ->  | [x] -> (tup (c+1) x) :: acc | a :: (b :: _ as t) -> if a = b then f (c+1) acc t else f 0 ((tup (c+1) a) :: acc) t in List.rev (f 0  l) let res = encode ["a"; "a"; "a"; "a"; "b"; "c"; "c"; "a"; "a"; "d"; "e"; "e"; "e"; "e"] let print_listof_string_rle rles = Format.printf "@[<1>%a@]@.\n" Format.(pp_print_list ~pp_sep:(fun fmt () -> Format.fprintf fmt ";@ ") pp) rles let a = One "a" let () = print_listof_string_rle res; print_endline (show a)
It was a bit hard for me to come to this solution because I’m a beginner and Iearnt the hard way what this function signature is meaning:
(Format.formatter -> 'a -> unit) -> Format.formatter -> 'a rle -> unit
And although this works, I’m not really convinced about my
print_listof_string_rle function because it has become a really specific function for
As I’m coming from a rather large pool of coding languages that aren’t functionnal, I am thinking (I may be wrong and accept that) that I could be able to create such function but a bit more generic, so that it would work for any
'a type inside the
type 'a rle, by using
Is there a way to make that function more generic, and/or to detect what type (either basic or complex type) so it could apply the best formatter for the type?