手動dictionary passingによる面倒type classプログラミング in OCaml

いろいろところ口を出してしまったので、どういう「感じ」になるのかだけテキトーに書いてみた。

type 'a printer = 'a -> string
let int_printer : int printer = string_of_int
let bool_printer : bool printer = string_of_bool
let pair_printer : 'a printer -> 'b printer -> ('a * 'b) printer =
  fun a_printer -> fun b_printer ->
    fun (x, y) -> "(" ^ a_printer x ^ ", " ^ b_printer y ^ ")"
let list_printer : 'a printer -> ('a list) printer =
  fun a_printer ->
    let rec a_list_printer_aux = function
      | [] -> ""
      | [x] -> a_printer x
      | x :: ys -> a_printer x ^ "; " ^ a_list_printer_aux ys in
    fun xs -> "[" ^ a_list_printer_aux xs ^ "]"
let print : 'a printer -> 'a -> string =
  fun a_printer ->
    fun x -> a_printer x

使い方:

# print
    (list_printer (pair_printer int_printer bool_printer))
    [(123, true); (456, false); (-789, true)] ;;
- : string = "[(123, true); (456, false); (-789, true)]"