改造: こんなことが出来るようになった

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 とかは聞くな。