{-# 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
-}