packages feed

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

module Haskell.Law.Applicative.Def where

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

open import Haskell.Prim.Applicative
open import Haskell.Prim.Monoid
open import Haskell.Prim.Tuple

open import Haskell.Law.Functor

record IsLawfulApplicative (F : Set → Set) ⦃ iAppF : Applicative F ⦄ : Set₁ where
  field
    overlap ⦃ super ⦄ : IsLawfulFunctor F

    -- Identity: pure id <*> v = v
    identity : (v : F a) → (pure id <*> v) ≡ v

    -- Composition: pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
    composition : {a b c : Set} → (u : F (b → c)) (v : F (a → b)) (w : F a)
      → (pure _∘_ <*> u <*> v <*> w) ≡ (u <*> (v <*> w))

    -- Homomorphism: pure f <*> pure x = pure (f x)
    homomorphism : {a b : Set} → (f : a → b) (x : a)
      → (Applicative._<*>_ iAppF (pure f) (pure x)) ≡ (pure (f x))

    -- Interchange: u <*> pure y = pure ($ y) <*> u
    interchange : {a b : Set} → (u : F (a → b)) (y : a)
      → (u <*> (pure y)) ≡ (pure (_$ y) <*> u)

    -- fmap f x = pure f <*> x
    functor : (f : a → b) (x : F a) → (fmap f x) ≡ ((pure f) <*> x)

open IsLawfulApplicative ⦃ ... ⦄ public

instance postulate
  iLawfulApplicativeFun : IsLawfulApplicative (λ b → a → b)

  iLawfulApplicativeTuple₂ : ⦃ Monoid a ⦄ → Applicative (a ×_)

  iLawfulApplicativeTuple₃ : ⦃ Monoid a ⦄ → ⦃ Monoid b ⦄ → Applicative (a × b ×_)