{-# LANGUAGE TypeApplications #-} import Control.Monad (join) -- Starling s :: (a -> b -> c) -> (a -> b) -> a -> c s = (<*>) -- Kestrel k :: a -> b -> a k = pure -- Bluebird b :: (b -> c) -> (a -> b) -> a -> c b = (.) -- b = pure (<*>) <*> pure -- Cardinal c :: (a -> b -> c) -> b -> a -> c c = flip -- c = ((.) . (<*>)) <*> pure pure -- Warbler w :: (a -> a -> b) -> a -> b w = join -- w = (<*>) <*> pure id -- Blackbird (.:) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c (.:) = (.) . (.) -- Identity idd :: forall a. a -> a idd = pure <*> (pure @((->) a)) {- One would expect that idd = pure <*> pure should work, but sadly Haskell cannot infer the right instance of Applicative -}