sig
  type 'f applicative = {
    pure : 'a. '-> ('a, 'f) Generic_util.App.T.app;
    apply :
      ''b.
        ('-> 'b, 'f) Generic_util.App.T.app ->
        ('a, 'f) Generic_util.App.T.app -> ('b, 'f) Generic_util.App.T.app;
  }
end