1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950(** A type of values with an associative operation and an identity element, for
example, integers with addition and zero. *)moduletypeBasic=sigtypet(** Must be the identity of [combine]:
- combine empty t = t
- combine t empty = t *)valempty:t(** Must be associative:
- combine a (combine b c) = combine (combine a b) c *)valcombine:t->t->tend(** This module type extends the basic definition of a monoid by adding a
convenient operator synonym [( @ ) = combine], as well as derived functions
[reduce] and [map_reduce]. *)moduletypeS=sigincludeBasicmoduleO:sig(** An operator alias for [combine]. *)val(@):t->t->tendvalreduce:tlist->tvalmap_reduce:f:('a->t)->'alist->tendmoduleCommutative=struct(** Like [Basic] but requires [combine] to be commutative.
The [combine_is_commutative] type is a "proof" of commutativity, so that
one can't simply pass any monoid where a commutative monoid is expected. *)moduletypeBasic=sigincludeBasictypecombine_is_commutative=unitend(** Like [S] but requires [combine] to be commutative. *)moduletypeS=sigincludeStypecombine_is_commutative=unitendend