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