packages feed

agda2hs-1.4: lib/base/Haskell/Law/Functor/FromMonad.agda

module Haskell.Law.Functor.FromMonad where

open import Haskell.Prim

open import Haskell.Prim.Functor
open import Haskell.Prim.Monad

open import Haskell.Law.Monad.Def as Monad
open import Haskell.Law.Equality
open import Haskell.Law.Functor

-------------------------------------------------------------------------------
-- Prove the Functor laws from the Monad laws

--
prop-PreLawfulMonad→IsLawfulFunctor
  : ∀ ⦃ _ : Monad m ⦄ ⦃ _ : PreLawfulMonad m ⦄
  → IsLawfulFunctor m
--
prop-PreLawfulMonad→IsLawfulFunctor .identity fa
  rewrite Monad.def-fmap->>= id fa
  = Monad.rightIdentity fa
prop-PreLawfulMonad→IsLawfulFunctor .composition fa f g
  rewrite Monad.def-fmap->>= g (fmap f fa)
  | Monad.def-fmap->>= f fa
  | Monad.def-fmap->>= (g ∘ f) fa
  = begin
    fa >>= (return ∘ g ∘ f)
  ≡⟨ cong-monad fa (λ x → sym (Monad.leftIdentity (f x) _)) ⟩
    fa >>= (λ x → return (f x) >>= (return ∘ g))
  ≡⟨ Monad.associativity _ _ _ ⟩
    (fa >>= (return ∘ f)) >>= (return ∘ g)
  ∎