改造: こんなことが出来るようになった
module Add : sig type 'a t val (+) : $:('a t) -> 'a -> 'a -> 'a val int : int t val float : float t val string : string t val int32 : int32 t end = struct type 'a t = 'a -> 'a -> 'a let (+) $:d = d let int = Pervasives.(+) let float = (+.) let string = (^) let int32 = Int32.add end open Add let double x = x + x let _ = (* muhahahaha! *) assert (double 1 = 2 ); assert (double 1.2 = 2.4); assert (double "x" = "xx")
'a list とか t -> t とかは聞くな。