Module Alg_structs.Functor
An interface for types that can be mapped over.
All you need to know to use this module effectively:
given type 'a t
, function map : f:('a -> 'b) -> 'a t -> 'b t
will map f
"over" t
by taking a value of type 'a t
to a value of type 'b
t
.
E.g., if
type 'a t = int list
then
map ~f:Int.to_string : int t -> string t
is a function which maps int list
s to string list
s, so
map ~f:Int.to_string [1;2;3] = ["1";"2";"3"]
A Rough Sketch of the Category Theoretic Basis
To repeat, you don't need to read any of the following in order to make use of this module.
The use of the word functor in this context refers to the category theoretic concept of Functor, which is a map between categories. A functor F: C -> D
that maps category C
to category D
consists of two mappings:
- a mapping of each object in
C
to some object inD
- a mapping of each arrow in
C
to some arrow inD
These mappings must respect the Law
s.
An "endofunctor" is a functor that is a map of one category within itself (or back onto itself).
We imagine a category CAML
(analogous to Hask), where the objects are OCaml types and the arrows are functions between those types. S
then specifies an interface for modules that implement an "endofunctor" on CAML
, mapping types to types and functions to functions.
Seed
module type UnlabeledSeed = sig ... end
Interface for a mappable type with an unlabeled
map
function.
Interface
Laws
Constructors
Module functors and signatures for expediting instantiation of Functors.
module MakeUnlabeled : functor (Seed : UnlabeledSeed) -> S with type 'a t = 'a Seed.t
MakeUnlabeled
makes an module instantiatingS
, with a labeledS.map
, out of a module instantiatingUnlabeledSeed
with an unlabeledmap
function.