sig
  module type Monad =
    sig
      type +'a m
      val return : '-> 'Deriving_monad.Monad.m
      val fail : string -> 'Deriving_monad.Monad.m
      val ( >>= ) :
        'Deriving_monad.Monad.m ->
        ('-> 'Deriving_monad.Monad.m) -> 'Deriving_monad.Monad.m
      val ( >> ) :
        'Deriving_monad.Monad.m ->
        'Deriving_monad.Monad.m -> 'Deriving_monad.Monad.m
    end
  module type MonadPlus =
    sig
      type +'a m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val mzero : 'a m
      val mplus : 'a m -> 'a m -> 'a m
    end
  module MonadDefault :
    functor
      (M : sig
             type +'a m
             val return : '-> 'Deriving_monad.MonadDefault.m
             val fail : string -> 'Deriving_monad.MonadDefault.m
             val ( >>= ) :
               'Deriving_monad.MonadDefault.m ->
               ('-> 'Deriving_monad.MonadDefault.m) ->
               'Deriving_monad.MonadDefault.m
           end->
      sig
        type 'a m = 'M.m
        val return : '-> 'a m
        val fail : string -> 'a m
        val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
        val ( >> ) : 'a m -> 'b m -> 'b m
      end
  module Monad_option :
    sig
      type 'a m = 'a option
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val mzero : 'a m
      val mplus : 'a m -> 'a m -> 'a m
    end
  module Monad_list :
    sig
      type 'a m = 'a list
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val mzero : 'a m
      val mplus : 'a m -> 'a m -> 'a m
    end
  module IO :
    sig
      type +'a m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val putStr : string -> unit m
      val runIO : 'a m -> 'a
      val mkIO : (unit -> 'b) -> 'b m
    end
  module type MonadUtilsSig =
    sig
      type +'a m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val liftM : ('-> 'b) -> 'a m -> 'b m
      val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
      val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
      val liftM4 :
        ('-> '-> '-> '-> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
      val liftM5 :
        ('-> '-> '-> '-> '-> 'f) ->
        'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
      val ap : ('-> 'b) m -> 'a m -> 'b m
      val sequence : 'a m list -> 'a list m
      val sequence_ : 'a m list -> unit m
      val mapM : ('-> 'b m) -> 'a list -> 'b list m
      val mapM_ : ('-> 'b m) -> 'a list -> unit m
      val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
      val join : 'a m m -> 'a m
      val filterM : ('-> bool m) -> 'a list -> 'a list m
      val mapAndUnzipM :
        ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
      val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
      val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
      val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
      val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
      val replicateM : int -> 'a m -> 'a list m
      val replicateM_ : int -> 'a m -> unit m
      val quand : bool -> unit m -> unit m
      val unless : bool -> unit m -> unit m
    end
  module MonadUtils :
    functor (M : Monad->
      sig
        type 'a m = 'M.m
        val return : '-> 'a m
        val fail : string -> 'a m
        val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
        val ( >> ) : 'a m -> 'b m -> 'b m
        val liftM : ('-> 'b) -> 'a m -> 'b m
        val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
        val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
        val liftM4 :
          ('-> '-> '-> '-> 'e) ->
          'a m -> 'b m -> 'c m -> 'd m -> 'e m
        val liftM5 :
          ('-> '-> '-> '-> '-> 'f) ->
          'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
        val ap : ('-> 'b) m -> 'a m -> 'b m
        val sequence : 'a m list -> 'a list m
        val sequence_ : 'a m list -> unit m
        val mapM : ('-> 'b m) -> 'a list -> 'b list m
        val mapM_ : ('-> 'b m) -> 'a list -> unit m
        val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
        val join : 'a m m -> 'a m
        val filterM : ('-> bool m) -> 'a list -> 'a list m
        val mapAndUnzipM :
          ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
        val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
        val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
        val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
        val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
        val replicateM : int -> 'a m -> 'a list m
        val replicateM_ : int -> 'a m -> unit m
        val quand : bool -> unit m -> unit m
        val unless : bool -> unit m -> unit m
      end
  module type MonadPlusUtilsSig =
    sig
      type +'a m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val liftM : ('-> 'b) -> 'a m -> 'b m
      val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
      val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
      val liftM4 :
        ('-> '-> '-> '-> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
      val liftM5 :
        ('-> '-> '-> '-> '-> 'f) ->
        'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
      val ap : ('-> 'b) m -> 'a m -> 'b m
      val sequence : 'a m list -> 'a list m
      val sequence_ : 'a m list -> unit m
      val mapM : ('-> 'b m) -> 'a list -> 'b list m
      val mapM_ : ('-> 'b m) -> 'a list -> unit m
      val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
      val join : 'a m m -> 'a m
      val filterM : ('-> bool m) -> 'a list -> 'a list m
      val mapAndUnzipM :
        ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
      val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
      val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
      val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
      val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
      val replicateM : int -> 'a m -> 'a list m
      val replicateM_ : int -> 'a m -> unit m
      val quand : bool -> unit m -> unit m
      val unless : bool -> unit m -> unit m
      val mzero : 'a m
      val mplus : 'a m -> 'a m -> 'a m
      val guard : bool -> unit m
      val msum : 'a m list -> 'a m
    end
  module MonadPlusUtils :
    functor (M : MonadPlus->
      sig
        type 'a m = 'M.m
        val return : '-> 'a m
        val fail : string -> 'a m
        val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
        val ( >> ) : 'a m -> 'b m -> 'b m
        val liftM : ('-> 'b) -> 'a m -> 'b m
        val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
        val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
        val liftM4 :
          ('-> '-> '-> '-> 'e) ->
          'a m -> 'b m -> 'c m -> 'd m -> 'e m
        val liftM5 :
          ('-> '-> '-> '-> '-> 'f) ->
          'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
        val ap : ('-> 'b) m -> 'a m -> 'b m
        val sequence : 'a m list -> 'a list m
        val sequence_ : 'a m list -> unit m
        val mapM : ('-> 'b m) -> 'a list -> 'b list m
        val mapM_ : ('-> 'b m) -> 'a list -> unit m
        val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
        val join : 'a m m -> 'a m
        val filterM : ('-> bool m) -> 'a list -> 'a list m
        val mapAndUnzipM :
          ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
        val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
        val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
        val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
        val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
        val replicateM : int -> 'a m -> 'a list m
        val replicateM_ : int -> 'a m -> unit m
        val quand : bool -> unit m -> unit m
        val unless : bool -> unit m -> unit m
        val mzero : 'a m
        val mplus : 'a m -> 'a m -> 'a m
        val guard : bool -> unit m
        val msum : 'a m list -> 'a m
      end
  module MonadPlusUtils_option :
    sig
      type 'a m = 'Monad_option.m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val liftM : ('-> 'b) -> 'a m -> 'b m
      val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
      val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
      val liftM4 :
        ('-> '-> '-> '-> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
      val liftM5 :
        ('-> '-> '-> '-> '-> 'f) ->
        'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
      val ap : ('-> 'b) m -> 'a m -> 'b m
      val sequence : 'a m list -> 'a list m
      val sequence_ : 'a m list -> unit m
      val mapM : ('-> 'b m) -> 'a list -> 'b list m
      val mapM_ : ('-> 'b m) -> 'a list -> unit m
      val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
      val join : 'a m m -> 'a m
      val filterM : ('-> bool m) -> 'a list -> 'a list m
      val mapAndUnzipM :
        ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
      val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
      val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
      val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
      val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
      val replicateM : int -> 'a m -> 'a list m
      val replicateM_ : int -> 'a m -> unit m
      val quand : bool -> unit m -> unit m
      val unless : bool -> unit m -> unit m
      val mzero : 'a m
      val mplus : 'a m -> 'a m -> 'a m
      val guard : bool -> unit m
      val msum : 'a m list -> 'a m
    end
  module MonadPlusUtils_list :
    sig
      type 'a m = 'Monad_list.m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val liftM : ('-> 'b) -> 'a m -> 'b m
      val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
      val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
      val liftM4 :
        ('-> '-> '-> '-> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
      val liftM5 :
        ('-> '-> '-> '-> '-> 'f) ->
        'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
      val ap : ('-> 'b) m -> 'a m -> 'b m
      val sequence : 'a m list -> 'a list m
      val sequence_ : 'a m list -> unit m
      val mapM : ('-> 'b m) -> 'a list -> 'b list m
      val mapM_ : ('-> 'b m) -> 'a list -> unit m
      val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
      val join : 'a m m -> 'a m
      val filterM : ('-> bool m) -> 'a list -> 'a list m
      val mapAndUnzipM :
        ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
      val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
      val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
      val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
      val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
      val replicateM : int -> 'a m -> 'a list m
      val replicateM_ : int -> 'a m -> unit m
      val quand : bool -> unit m -> unit m
      val unless : bool -> unit m -> unit m
      val mzero : 'a m
      val mplus : 'a m -> 'a m -> 'a m
      val guard : bool -> unit m
      val msum : 'a m list -> 'a m
    end
  module Monad_IO :
    sig
      type 'a m = 'IO.m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val liftM : ('-> 'b) -> 'a m -> 'b m
      val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
      val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
      val liftM4 :
        ('-> '-> '-> '-> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
      val liftM5 :
        ('-> '-> '-> '-> '-> 'f) ->
        'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
      val ap : ('-> 'b) m -> 'a m -> 'b m
      val sequence : 'a m list -> 'a list m
      val sequence_ : 'a m list -> unit m
      val mapM : ('-> 'b m) -> 'a list -> 'b list m
      val mapM_ : ('-> 'b m) -> 'a list -> unit m
      val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
      val join : 'a m m -> 'a m
      val filterM : ('-> bool m) -> 'a list -> 'a list m
      val mapAndUnzipM :
        ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
      val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
      val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
      val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
      val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
      val replicateM : int -> 'a m -> 'a list m
      val replicateM_ : int -> 'a m -> unit m
      val quand : bool -> unit m -> unit m
      val unless : bool -> unit m -> unit m
    end
  module type Monad_state_type =
    sig
      type +'a m
      val return : '-> 'a m
      val fail : string -> 'a m
      val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
      val ( >> ) : 'a m -> 'b m -> 'b m
      val liftM : ('-> 'b) -> 'a m -> 'b m
      val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
      val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
      val liftM4 :
        ('-> '-> '-> '-> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
      val liftM5 :
        ('-> '-> '-> '-> '-> 'f) ->
        'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
      val ap : ('-> 'b) m -> 'a m -> 'b m
      val sequence : 'a m list -> 'a list m
      val sequence_ : 'a m list -> unit m
      val mapM : ('-> 'b m) -> 'a list -> 'b list m
      val mapM_ : ('-> 'b m) -> 'a list -> unit m
      val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
      val join : 'a m m -> 'a m
      val filterM : ('-> bool m) -> 'a list -> 'a list m
      val mapAndUnzipM :
        ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
      val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
      val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
      val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
      val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
      val replicateM : int -> 'a m -> 'a list m
      val replicateM_ : int -> 'a m -> unit m
      val quand : bool -> unit m -> unit m
      val unless : bool -> unit m -> unit m
      type state
      val get : Deriving_monad.Monad_state_type.state m
      val put : Deriving_monad.Monad_state_type.state -> unit m
      val runState :
        'a m ->
        Deriving_monad.Monad_state_type.state ->
        'a * Deriving_monad.Monad_state_type.state
    end
  module Monad_state :
    functor (S : sig type state end->
      sig
        type +'a m
        val return : '-> 'a m
        val fail : string -> 'a m
        val ( >>= ) : 'a m -> ('-> 'b m) -> 'b m
        val ( >> ) : 'a m -> 'b m -> 'b m
        val liftM : ('-> 'b) -> 'a m -> 'b m
        val liftM2 : ('-> '-> 'c) -> 'a m -> 'b m -> 'c m
        val liftM3 : ('-> '-> '-> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
        val liftM4 :
          ('-> '-> '-> '-> 'e) ->
          'a m -> 'b m -> 'c m -> 'd m -> 'e m
        val liftM5 :
          ('-> '-> '-> '-> '-> 'f) ->
          'a m -> 'b m -> 'c m -> 'd m -> 'e m -> 'f m
        val ap : ('-> 'b) m -> 'a m -> 'b m
        val sequence : 'a m list -> 'a list m
        val sequence_ : 'a m list -> unit m
        val mapM : ('-> 'b m) -> 'a list -> 'b list m
        val mapM_ : ('-> 'b m) -> 'a list -> unit m
        val ( =<< ) : ('-> 'b m) -> 'a m -> 'b m
        val join : 'a m m -> 'a m
        val filterM : ('-> bool m) -> 'a list -> 'a list m
        val mapAndUnzipM :
          ('-> ('b * 'c) m) -> 'a list -> ('b list * 'c list) m
        val zipWithM : ('-> '-> 'c m) -> 'a list -> 'b list -> 'c list m
        val zipWithM_ : ('-> '-> 'c m) -> 'a list -> 'b list -> unit m
        val foldM : ('-> '-> 'a m) -> '-> 'b list -> 'a m
        val foldM_ : ('-> '-> 'a m) -> '-> 'b list -> unit m
        val replicateM : int -> 'a m -> 'a list m
        val replicateM_ : int -> 'a m -> unit m
        val quand : bool -> unit m -> unit m
        val unless : bool -> unit m -> unit m
        type state = S.state
        val get : state m
        val put : state -> unit m
        val runState : 'a m -> state -> 'a * state
      end
end