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