packages feed

agda2hs-1.3: lib/Haskell/Law/Monoid/Def.agda

module Haskell.Law.Monoid.Def where

open import Haskell.Prim
open import Haskell.Prim.Tuple

open import Haskell.Prim.Foldable
open import Haskell.Prim.Monoid

open import Haskell.Law.Semigroup.Def

record IsLawfulMonoid (a : Set) ⦃ iMonoidA : Monoid a ⦄ : Set₁ where
  field
    overlap ⦃ super ⦄ : IsLawfulSemigroup a

    -- Right identity: x <> mempty = x
    rightIdentity : (x : a) → x <> mempty ≡ x

    -- Left identity: mempty <> x = x
    leftIdentity : (x : a) → mempty <> x ≡ x

    -- Concatenation: mconcat = foldr (<>) mempty
    concatenation : (xs : List a) → mconcat xs ≡ foldr _<>_ mempty xs

open IsLawfulMonoid ⦃ ... ⦄ public

postulate instance
  iLawfulMonoidFun : ⦃ iSemB : Monoid b ⦄ → ⦃ IsLawfulMonoid b ⦄ → IsLawfulMonoid (a → b)

  iLawfulMonoidUnit : IsLawfulMonoid ⊤

  iLawfulMonoidTuple₂ : ⦃ iSemA : Monoid a ⦄ ⦃ iSemB : Monoid b ⦄
                      → ⦃ IsLawfulMonoid a ⦄ → ⦃ IsLawfulMonoid b ⦄
                      → IsLawfulMonoid (a × b)

  iLawfulMonoidTuple₃ : ⦃ iSemA : Monoid a ⦄ ⦃ iSemB : Monoid b ⦄ ⦃ iSemC : Monoid c ⦄
                      → ⦃ IsLawfulMonoid a ⦄ → ⦃ IsLawfulMonoid b ⦄ → ⦃ IsLawfulMonoid c ⦄
                      → IsLawfulMonoid (a × b × c)