sig
  module type Mappable =
    sig
      type 'a mappable
      val map : ('-> 'b) -> 'a mappable -> 'b mappable
    end
  module type OrderedType = sig type t val compare : t -> t -> int end
  module type Monad =
    sig
      type 'a m
      val bind : 'a m -> ('-> 'b m) -> 'b m
      val return : '-> 'a m
    end
end