class Functor f where fmap ∷ (a → b) → f a → f b -- (Identity) ∀x. fmap id x = x -- (Composition) ∀f g. fmap (g ∘ f) = fmap g ∘ fmap f class Functor f ⇒ Applicative f where pure ∷ a → f a (⊛) ∷ f (a → b) → f a → f b -- (Identity) ∀v. pure id ⊛ v = v -- (Composition) ∀u v w. pure (∘) ⊛ u ⊛ v ⊛ w = u ⊛ (v ⊛ w) -- (Homomorphism) ∀f x. pure f ⊛ pure x = pure (f x) -- (Interchange) ∀u y. u ⊛ pure y = pure ($ y) ⊛ u