Legend:
Library
Module
Module type
Parameter
Class
Class type
Endo is a semigroup where the operator is the composition of functions with input and output of the same type.
Or, to paraphrase the Haskell docs, Endo implements "the semigroup of endomorphisms under composition". "Endomorphism" just meaning a morphism with the same object for its source and target, i.e., (here) a function with input and output of same type.
E.g. using the first-order module generator Endo.make, we can make the Endo semigroup over functions of type string -> string thus:
# module E = (val Semigroup.Endo.make "");;
module E :
sig
type t = string -> string
val op : t -> t -> t
val ( * ) : t -> t -> t
val concat : t NonEmptyList.t -> t
end;;
# let comp = E.( (fun y -> "Hello, " ^ y) * (fun x -> x ^ "!") );;
val comp : E.t = <fun>;;
# comp "OCaml";;
- : string = "Hello, OCaml!"
Make (T) is a module implementing the Endo semigroup for functions over type T.t
val make : 'aAlg_structs__.Util.proxy->(moduleSwithtypet = 'a->'a)
make (Proxy : t Util.proxy) is a first-class module implementing the Endo semigroup for functions (t -> t).
Note that Proxy is used only to convey the type. See Util.proxy.
You can lift the result back into the module like so:
# module E = (val Semigroup.Endo.make (Util.Proxy : int proxy));;
module E :
sig
type t = int -> int
val op : t -> t -> t
val ( * ) : t -> t -> t
val concat : t NonEmptyList.t -> t
end