Module Higher_kinded
This 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.
TypesIf A
implements the signature S
, (a, A.witness1) t
is equivalent to a A.t
.
type ('a, 'b, 'witness) t2 = ('a , ('b , 'witness ) t ) t
If A
implements the signature S2
, (a, b, A.witness2) t2
is equivalent to (a, b) A.t
.
type ('a, 'b, 'c, 'witness) t3 = ('a , 'b , ('c , 'witness ) t ) t2
If A
implements the signature S3
, (a, b, c, A.witness3) t3
is equivalent to (a, b, c) A.t
.
type ('a, 'b, 'c, 'd, 'witness) t4 = ('a , 'b , 'c , ('d , 'witness ) t ) t3
If A
implements the signature S4
, (a, b, c, d, A.witness4) t4
is equivalent to (a, b, c, d) A.t
.
type ('a, 'b, 'c, 'd, 'e, 'witness) t5 = ('a , 'b , 'c , 'd , ('e , 'witness ) t ) t4
If A
implements the signature S5
, (a, b, c, d, e, A.witness5) t5
is equivalent to (a, b, c, d, e) A.t
.
type ('a, 'b, 'c, 'd, 'e, 'f, 'witness) t6 =
('a , 'b , 'c , 'd , 'e , ('f , 'witness ) t ) t5
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 ) t6
If 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 ) t7
If 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
.
SignaturesThese are the signatures implemented by the Make
family of functors.
module type S = sig ... end
module type S2 = sig ... end
module type S3 = sig ... end
module type S4 = sig ... end
module type S5 = sig ... end
module type S6 = sig ... end
module type S7 = sig ... end
module type S8 = sig ... end
FunctorsThis is the meat of the library. Use these functors to implement the higher_kinded interface.
module Make4
(X : sig ... end ) :
S4 with type ('a, 'x, 'y, 'z) t := ('a , 'x , 'y , 'z ) X.t
module Make5
(X : sig ... end ) :
S5 with type ('a, 'w, 'x, 'y, 'z) t := ('a , 'w , 'x , 'y , 'z ) X.t
module Make6
(X : sig ... end ) :
S6 with type ('a, 'v, 'w, 'x, 'y, 'z) t := ('a , 'v , 'w , 'x , 'y , 'z ) X.t
module Make7
(X : sig ... end ) :
S7
with type ('a, 'u, 'v, 'w, 'x, 'y, 'z) t :=
('a , 'u , 'v , 'w , 'x , 'y , 'z ) X.t
module Make8
(X : sig ... end ) :
S8
with type ('a, 't, 'u, 'v, 'w, 'x, 'y, 'z) t :=
('a , 't , 'u , 'v , 'w , 'x , 'y , 'z ) X.t
ImplementationsBase
, 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.
module Ident : S with type 'a t := 'a
t
itself has two type parameters, so we might as well implement S2
right here.
include S2 with type ('a, 'witness) t := ('a , 'witness ) t
val inject : ('a , 'z ) t -> ('a , 'z ) witness
val project : ('a , 'z ) witness -> ('a , 'z ) t