sig
  type 'a t = 'a
  val bind : 'a t -> ('a -> 'b t) -> 'b t
  val return : 'a -> 'a t
  val fmap : ('a -> 'b) -> 'a t -> 'b t
  val fmap2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
  val fmap3 : ('a -> 'b -> 'c -> 'd) -> 'a t -> 'b t -> 'c t -> 'd t
  val fmap4 :
    ('a -> 'b -> 'c -> 'd -> 'e) -> 'a t -> 'b t -> 'c t -> 'd t -> 'e t
  val fmap5 :
    ('a -> 'b -> 'c -> 'd -> 'e -> 'f) ->
    'a t -> 'b t -> 'c t -> 'd t -> 'e t -> 'f t
end