0 | module Data.ComMonoid
2 | import public Data.Num
3 | import public Data.Bag
5 | %hide Prelude.Semigroup
11 | record ComMonoid (a : Type) where
12 | constructor MkComMonoid
18 | numIsMonoid : Num a => ComMonoid a
19 | numIsMonoid = MkComMonoid (+) 0
22 | listIsMonoid : ComMonoid (List a)
23 | listIsMonoid = MkComMonoid (++) []
26 | bagIsMonoid : ComMonoid (Bag a)
27 | bagIsMonoid = MkComMonoid (++) (MkBag [])
31 | pairIsMonoid : ComMonoid a => ComMonoid b => ComMonoid (a, b)
32 | pairIsMonoid @{MkComMonoid plusA neutralA} @{MkComMonoid plusB neutralB}
34 | (\(a, b), (a', b') => (plusA a a', plusB b b'))
35 | (neutralA, neutralB)
39 | sum : ComMonoid a => Bag a -> a
40 | sum @{mon} = foldr (plus mon) (neutral mon)
43 | namespace NotExposingType
47 | ComMonoid = (t : Type ** ComMonoid t)
51 | ComMonoidHomo : ComMonoid -> ComMonoid -> Type
52 | ComMonoidHomo (
t ** _) (
t' ** _)
= t -> t'