functor (X : Args->
  sig
    type ('a, 'e) arg = 'X.arg
    type ('f, 'r, 'e) t = ('f, 'r) X.t
    val nil : ('r, 'r, 'a) t
    val cons : ('a, 'e) arg -> ('f, 'r, 'e) t -> ('-> 'f, 'r, 'e) t
    val ( @> ) : ('a, 'e) arg -> ('f, 'r, 'e) t -> ('-> 'f, 'r, 'e) t
    val step : ('f1, 'r, 'e) t -> f:('f2 -> 'f1) -> ('f2, 'r, 'e) t
    val mapN : f:'-> ('f, 'r, 'e) t -> ('r, 'e) arg
    val applyN : ('f, 'e) arg -> ('f, 'r, 'e) t -> ('r, 'e) arg
  end