0 | module Data.ComMonoid
2 | %hide Prelude.Semigroup
8 | record ComMonoid (a : Type) where
9 | constructor MkComMonoid
15 | doubleIsMonoid : ComMonoid Double
16 | doubleIsMonoid = MkComMonoid (+) 0
20 | unitIsMonoid : ComMonoid Unit
21 | unitIsMonoid = MkComMonoid (\(), () => ()) ()
25 | numIsMonoid : Num a => ComMonoid a
26 | numIsMonoid = MkComMonoid (+) 0
29 | listIsMonoid : ComMonoid (List a)
30 | listIsMonoid = MkComMonoid (++) []
35 | pairIsMonoid : ComMonoid a => ComMonoid b => ComMonoid (a, b)
36 | pairIsMonoid @{MkComMonoid plusA neutralA} @{MkComMonoid plusB neutralB}
38 | (\(a, b), (a', b') => (plusA a a', plusB b b'))
39 | (neutralA, neutralB)
43 | sum : ComMonoid a => List a -> a
44 | sum @{mon} = foldr (plus mon) (neutral mon)
47 | namespace NotExposingType
51 | ComMonoid = (t : Type ** ComMonoid t)
54 | record ComMonoidHomo (c, d : ComMonoid) where
55 | constructor MkComMonoidHomo
56 | underlyingMap : c.fst -> d.fst
57 | plusPreserve : (x, y : c.fst) ->
58 | underlyingMap (c.snd.plus x y) = d.snd.plus (underlyingMap x) (underlyingMap y)
59 | neutralPreserve : underlyingMap c.snd.neutral = d.snd.neutral