Haskell Language Applicative Functor


Applicative is the class of types f :: * -> * which allows lifted function application over a structure where the function is also embedded in that structure.



class Functor f => Applicative f where
    pure  :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b

Note the Functor constraint on f. The pure function returns its argument embedded in the Applicative structure. The infix function <*> (pronounced "apply") is very similar to fmap except with the function embedded in the Applicative structure.

A correct instance of Applicative should satisfy the applicative laws, though these are not enforced by the compiler:

pure id <*> a = a                              -- identity
pure (.) <*> a <*> b <*> c = a <*> (b <*> c)   -- composition
pure f <*> pure a = pure (f a)                 -- homomorphism
a <*> pure b = pure ($ b) <*> a                -- interchange