Почему f <$> g <$> x эквивалентно (f. G) <$> x, хотя <$> не является право-ассоциативным?

Почему f <$> g <$> x эквивалентен (f . g) <$> x, хотя <$> не является право-ассоциативным?

(Эта эквивалентность справедлива в популярной идиоме с простым $, но в настоящее время $ является право-ассоциативной!)

<*> имеет ту же ассоциативность и приоритет, что и <$>, но ведет себя по-другому!

Пример:

Prelude Control.Applicative> (show . show) <$> Just 3
Just "\"3\""
Prelude Control.Applicative> show <$> show <$> Just 3
Just "\"3\""
Prelude Control.Applicative> pure show <*> pure show <*> Just 3

<interactive>:12:6:
    Couldn't match type `[Char]' with `a0 -> b0'
    Expected type: (a1 -> String) -> a0 -> b0
      Actual type: (a1 -> String) -> String
    In the first argument of `pure', namely `show'
    In the first argument of `(<*>)', namely `pure show'
    In the first argument of `(<*>)', namely `pure show <*> pure show'
Prelude Control.Applicative> 
Prelude Control.Applicative> :i (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b
    -- Defined in `Data.Functor'
infixl 4 <$>
Prelude Control.Applicative> :i (<*>)
class Functor f => Applicative f where
  ...
  (<*>) :: f (a -> b) -> f a -> f b
  ...
    -- Defined in `Control.Applicative'
infixl 4 <*>
Prelude Control.Applicative> 

Из определения <$> я ожидал бы, что show <$> show <$> Just 3 тоже не сработает.

Ответ 1

Почему f <$> g <$> x эквивалентен (f . g) <$> x?

Это не столько функция-функтор, сколько вещь Хаскелла. Причина, по которой он работает, заключается в том, что функции являются функторами. Оба оператора <$> работают в разных функторах!

f <$> g на самом деле совпадает с f . g, поэтому эквивалентность, о которой вы просите, более тривиальна, чем f <$> (g <$> x) ≡ f . g <$> x.