sig
  module T :
    sig
      type 'f monad = {
        return : 'a. 'a -> ('a, 'f) Generic_util.App.T.app;
        bind :
          'a 'b.
            ('a, 'f) Generic_util.App.T.app ->
            ('a -> ('b, 'f) Generic_util.App.T.app) ->
            ('b, 'f) Generic_util.App.T.app;
      }
    end
  type 'f monad =
    'f Generic_util_monad.T.monad = {
    return : 'a. 'a -> ('a, 'f) Generic_util.App.T.app;
    bind :
      'a 'b.
        ('a, 'f) Generic_util.App.T.app ->
        ('a -> ('b, 'f) Generic_util.App.T.app) ->
        ('b, 'f) Generic_util.App.T.app;
  }
  type 'f t = 'f Generic_util_monad.monad
  val fun_of_mon :
    'a Generic_util_monad.monad -> 'a Generic_util.Functor.T.functorial
  val app_of_mon :
    'a Generic_util_monad.monad -> 'a Generic_util.Applicative.T.applicative
  val join :
    'a Generic_util_monad.monad ->
    (('b, 'a) Generic_util.App.T.app, 'a) Generic_util.App.T.app ->
    ('b, 'a) Generic_util.App.T.app
  val liftM :
    'a Generic_util_monad.monad ->
    ('b -> 'c) ->
    ('b, 'a) Generic_util.App.T.app -> ('c, 'a) Generic_util.App.T.app
  val liftM2 :
    'a Generic_util_monad.monad ->
    ('b -> 'c -> 'd) ->
    ('b, 'a) Generic_util.App.T.app ->
    ('c, 'a) Generic_util.App.T.app -> ('d, 'a) Generic_util.App.T.app
  val liftM3 :
    'a Generic_util_monad.monad ->
    ('b -> 'c -> 'd -> 'e) ->
    ('b, 'a) Generic_util.App.T.app ->
    ('c, 'a) Generic_util.App.T.app ->
    ('d, 'a) Generic_util.App.T.app -> ('e, 'a) Generic_util.App.T.app
  val liftM4 :
    'a Generic_util_monad.monad ->
    ('b -> 'c -> 'd -> 'e -> 'f) ->
    ('b, 'a) Generic_util.App.T.app ->
    ('c, 'a) Generic_util.App.T.app ->
    ('d, 'a) Generic_util.App.T.app ->
    ('e, 'a) Generic_util.App.T.app -> ('f, 'a) Generic_util.App.T.app
  val traverseM :
    'f Generic_util_monad.monad ->
    ('a -> ('b, 'f) Generic_util.App.T.app) ->
    'a list -> ('b list, 'f) Generic_util.App.T.app
  val sequenceM :
    'f Generic_util_monad.monad ->
    ('a, 'f) Generic_util.App.T.app list ->
    ('a list, 'f) Generic_util.App.T.app
  val id : Generic_util.App.id Generic_util_monad.monad
  val option : Generic_util.App.option' Generic_util_monad.monad
  val list : Generic_util.App.list' Generic_util_monad.monad
  module State :
    sig
      type 'b state = STATE
      type (_, _) Generic_util.App.T.app +=
          State :
            ('b -> 'a * 'b) -> ('a, 'b Generic_util_monad.State.state)
                               Generic_util.App.T.app
      val run_state :
        ('a, 'b Generic_util_monad.State.state) Generic_util.App.T.app ->
        'b -> 'a * 'b
      val state : 'a Generic_util_monad.State.state Generic_util_monad.monad
      val get :
        ('a, 'a Generic_util_monad.State.state) Generic_util.App.T.app
      val put :
        'a ->
        (unit, 'a Generic_util_monad.State.state) Generic_util.App.T.app
    end
  module Reader :
    sig
      type 'b reader = READER
      type (_, _) Generic_util.App.T.app +=
          Reader :
            ('b -> 'a) -> ('a, 'b Generic_util_monad.Reader.reader)
                          Generic_util.App.T.app
      val run_reader :
        ('a, 'b Generic_util_monad.Reader.reader) Generic_util.App.T.app ->
        'b -> 'a
      val reader :
        'a Generic_util_monad.Reader.reader Generic_util_monad.monad
      val ask :
        ('a, 'a Generic_util_monad.Reader.reader) Generic_util.App.T.app
      val local :
        ('a -> 'b) ->
        ('c, 'b Generic_util_monad.Reader.reader) Generic_util.App.T.app ->
        ('c, 'a Generic_util_monad.Reader.reader) Generic_util.App.T.app
    end
  module IO :
    sig
      type io = IO_
      type (_, _) Generic_util.App.T.app +=
          IO :
            (unit -> 'a) -> ('a, Generic_util_monad.IO.io)
                            Generic_util.App.T.app
      val embed_io :
        (unit -> 'a) -> ('a, Generic_util_monad.IO.io) Generic_util.App.T.app
      val run_io :
        ('a, Generic_util_monad.IO.io) Generic_util.App.T.app -> 'a
      val io : Generic_util_monad.IO.io Generic_util_monad.monad
    end
end