Copyright  (c) 2011 diagramscore team (see LICENSE) 

License  BSDstyle (see LICENSE) 
Maintainer  diagramsdiscuss@googlegroups.com 
Safe Haskell  Safe 
Language  Haskell2010 
Monoid and semigroup actions.
 class Action m s where
Documentation
Type class for monoid (and semigroup) actions, where monoidal
values of type m
"act" on values of another type s
.
Instances are required to satisfy the laws
act mempty = id
act (m1 `mappend` m2) = act m1 . act m2
Semigroup instances are required to satisfy the second law but with
(<>
) instead of mappend
. Additionally, if the type s
has
any algebraic structure, act m
should be a homomorphism. For
example, if s
is also a monoid we should have act m mempty =
mempty
and act m (s1 `mappend` s2) = (act m s1) `mappend`
(act m s2)
.
By default, act = const id
, so for a type M
which should have
no action on anything, it suffices to write
instance Action M s
with no method implementations.
It is a bit awkward dealing with instances of Action
, since it
is a multiparameter type class but we can't add any functional
dependenciesthe relationship between monoids and the types on
which they act is truly manytomany. In practice, this library
has chosen to have instance selection for Action
driven by the
first type parameter. That is, you should never write an
instance of the form Action m SomeType
since it will overlap
with instances of the form Action SomeMonoid t
. Newtype
wrappers can be used to (awkwardly) get around this.
Action () l # 

Action m s => Action (Option m) s # 

Action (Endo a) a # 
Note that in order for this instance to satisfy the 
Action (SM a) () #  
Action m n => Action (Split m) n #  By default, the action of a split monoid is the same as for the underlying monoid, as if the split were removed. 
(Action a a', Action (SM a) l) => Action (SM a) (Option a', l) #  
(Action m r, Action n r) => Action ((:+:) m n) r #  Coproducts act on other things by having each of the components act individually. 