手動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)]"