sig
  module T :
    sig
      type 'f monad = {
        return : 'a. '-> ('a, 'f) Generic_util.App.T.app;
        bind :
          ''b.
            ('a, 'f) Generic_util.App.T.app ->
            ('-> ('b, 'f) Generic_util.App.T.app) ->
            ('b, 'f) Generic_util.App.T.app;
      }
    end
  type 'f monad =
    'Generic_util_monad.T.monad = {
    return : 'a. '-> ('a, 'f) Generic_util.App.T.app;
    bind :
      ''b.
        ('a, 'f) Generic_util.App.T.app ->
        ('-> ('b, 'f) Generic_util.App.T.app) ->
        ('b, 'f) Generic_util.App.T.app;
  }
  type 'f t = 'Generic_util_monad.monad
  val fun_of_mon :
    'Generic_util_monad.monad -> 'Generic_util.Functor.T.functorial
  val app_of_mon :
    'Generic_util_monad.monad -> 'Generic_util.Applicative.T.applicative
  val join :
    '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 :
    'Generic_util_monad.monad ->
    ('-> 'c) ->
    ('b, 'a) Generic_util.App.T.app -> ('c, 'a) Generic_util.App.T.app
  val liftM2 :
    'Generic_util_monad.monad ->
    ('-> '-> 'd) ->
    ('b, 'a) Generic_util.App.T.app ->
    ('c, 'a) Generic_util.App.T.app -> ('d, 'a) Generic_util.App.T.app
  val liftM3 :
    'Generic_util_monad.monad ->
    ('-> '-> '-> '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 :
    'Generic_util_monad.monad ->
    ('-> '-> '-> '-> '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 :
    'Generic_util_monad.monad ->
    ('-> ('b, 'f) Generic_util.App.T.app) ->
    'a list -> ('b list, 'f) Generic_util.App.T.app
  val sequenceM :
    '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 :
            ('-> 'a * 'b) -> ('a, 'Generic_util_monad.State.state)
                               Generic_util.App.T.app
      val run_state :
        ('a, 'Generic_util_monad.State.state) Generic_util.App.T.app ->
        '-> 'a * 'b
      val state : 'Generic_util_monad.State.state Generic_util_monad.monad
      val get :
        ('a, 'Generic_util_monad.State.state) Generic_util.App.T.app
      val put :
        '->
        (unit, '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 :
            ('-> 'a) -> ('a, 'Generic_util_monad.Reader.reader)
                          Generic_util.App.T.app
      val run_reader :
        ('a, 'Generic_util_monad.Reader.reader) Generic_util.App.T.app ->
        '-> 'a
      val reader :
        'Generic_util_monad.Reader.reader Generic_util_monad.monad
      val ask :
        ('a, 'Generic_util_monad.Reader.reader) Generic_util.App.T.app
      val local :
        ('-> 'b) ->
        ('c, 'Generic_util_monad.Reader.reader) Generic_util.App.T.app ->
        ('c, '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