{-# OPTIONS --allow-unsolved-metas #-} module Applicative where open import Prelude open import Algebra module _ {đ : Type a} (mon : Monoid đ) where open Monoid mon constApplicative : Applicative {ââ = b} (const đ) constApplicative .Applicative.pure _ = Îľ constApplicative .Applicative._<*>_ = _â_ constApplicative .Applicative.pure-homo _ _ = Îľâ _ constApplicative .Applicative.<*>-interchange u _ = âÎľ u Íž sym (Îľâ _) constApplicative .Applicative.<*>-comp u v w = cong (Îť eu â eu â v â w) (Îľâ u) Íž assoc _ _ _ idApplicative : Applicative {ââ = a} id idApplicative .Applicative.pure = id idApplicative .Applicative._<*>_ = _$_ idApplicative .Applicative.pure-homo f x = refl idApplicative .Applicative.<*>-interchange u y = refl idApplicative .Applicative.<*>-comp u v w = refl module _ {F : Type b â Type c} {G : Type a â Type b} (fa : Applicative F) (ga : Applicative G) where open Applicative ⌠... ⌠instance _ : Applicative F _ = fa instance _ : Applicative G _ = ga composeApplicative : Applicative (F â G) composeApplicative .Applicative.pure x = pure (pure x) composeApplicative .Applicative._<*>_ fs xs = ⌠fs <*> xs ⌠composeApplicative .Applicative.pure-homo f x = {!!} composeApplicative .Applicative.<*>-interchange u y = {!!} composeApplicative .Applicative.<*>-comp u v w = {!!}