Higher_kindedSourceThis library allows you to use higher-kinded types in OCaml. See the README for a short tutorial on what that means and how to use it.
If A implements the signature S, (a, A.witness1) t is equivalent to a A.t.
If A implements the signature S2, (a, b, A.witness2) t2 is equivalent to (a, b) A.t.
If A implements the signature S3, (a, b, c, A.witness3) t3 is equivalent to (a, b, c) A.t.
If A implements the signature S4, (a, b, c, d, A.witness4) t4 is equivalent to (a, b, c, d) A.t.
If A implements the signature S5, (a, b, c, d, e, A.witness5) t5 is equivalent to (a, b, c, d, e) A.t.
If A implements the signature S6, (a, b, c, d, e, f, A.witness6) t6 is equivalent to (a, b, c, d, e, f) A.t.
type ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'witness) t7 =
('a, 'b, 'c, 'd, 'e, 'f, ('g, 'witness) t) t6If A implements the signature S7, (a, b, c, d, e, f, g, A.witness7) t7 is equivalent to (a, b, c, d, e, f, g) A.t.
type ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'witness) t8 =
('a, 'b, 'c, 'd, 'e, 'f, 'g, ('h, 'witness) t) t7If A implements the signature S8, (a, b, c, d, e, f, g, h, A.witness8) t8 is equivalent to (a, b, c, d, e, f, g, h) A.t.
These are the signatures implemented by the Make family of functors.
This is the meat of the library. Use these functors to implement the higher_kinded interface.
Base, Core, and Async don't depend on Higher_kinded, so we put these implementations here instead of in the respective modules where they might have been a nicer fit.
t itself has two type parameters, so we might as well implement S2 right here.