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