Module docstring
{"# Monoid and group homomorphisms
This file defines the bundled structures for monoid and group homomorphisms. Namely, we define
MonoidHom (resp., AddMonoidHom) to be bundled homomorphisms between multiplicative (resp.,
additive) monoids or groups.
We also define coercion to a function, and usual operations: composition, identity homomorphism, pointwise multiplication and pointwise inversion.
This file also defines the lesser-used (and notation-less) homomorphism types which are used as building blocks for other homomorphisms:
ZeroHomOneHomAddHomMulHom
Notations
→+: BundledAddMonoidhoms. Also use forAddGrouphoms.→*: BundledMonoidhoms. Also use forGrouphoms.→ₙ+: BundledAddSemigrouphoms.→ₙ*: BundledSemigrouphoms.
Implementation notes
There's a coercion from bundled homs to fun, and the canonical notation is to use the bundled hom as a function via this coercion.
There is no GroupHom -- the idea is that MonoidHom is used.
The constructor for MonoidHom needs a proof of map_one as well
as map_mul; a separate constructor MonoidHom.mk' will construct
group homs (i.e. monoid homs between groups) given only a proof
that multiplication is preserved,
Implicit {} brackets are often used instead of type class [] brackets. This is done when the
instances can be inferred because they are implicit arguments to the type MonoidHom. When they
can be inferred from the type it is faster to use this method than to use type class inference.
Historically this file also included definitions of unbundled homomorphism classes; they were
deprecated and moved to Deprecated/Group.
Tags
MonoidHom, AddMonoidHom
","Bundled morphisms can be down-cast to weaker bundlings "}