Я посмотрел сюда: http://www.soi.city.ac.uk/~ross/papers/Applicative.pdf
По этому тексту получается вот, что:
...
\a b -> (flip ($)) <$> a <*> b -- definition of liftA2
\a b -> (pure (flip ($)) <*> a) <*> b -- definition of l<$>
Скобки можно переставлять и раскрывать? По статье - можно.
\a b -> pure (flip ($)) <*> a <*> b
Тут дальше лог с выводом типов, не то, чтобы это было доказательством, но, может, на что натолкнет:
*Main Control.Applicative> :t \ a b -> pure (flip ($)) <*> a <*> b
\ a b -> pure (flip ($)) <*> a <*> b :: (Applicative f) =>
f a -> f (a -> b) -> f b
*Main Control.Applicative> :t \ a b -> pure (($)) <*> a <*> b
\ a b -> pure (($)) <*> a <*> b :: (Applicative f) => f (a -> b) -> f a -> f b
*Main Control.Applicative> :t pure (flip ($))
pure (flip ($)) :: (Applicative f) => f (a -> (a -> b) -> b)
*Main Control.Applicative> :t (<*>)
(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b
*Main Control.Applicative> :t (pure (flip ($) <*>)
:1:20: parse error (possibly incorrect indentation)
*Main Control.Applicative> :t (pure (flip ($)) <*>)
(pure (flip ($)) <*>) :: (Applicative f) => f a -> f ((a -> b) -> b)
*Main Control.Applicative>
Первым параметром мы можем подставить f a, получим Applicative f => f ((a->b)->b). Если обединить (pure (flip ($)) <*> a) с (b :: f (a->b)) путем применения <*>, то и получим f b.
Как-то так.
Порядок применения эффектов в Applicative f сохраняется.
no subject
По этому тексту получается вот, что:
Скобки можно переставлять и раскрывать? По статье - можно.
\a b -> pure (flip ($)) <*> a <*> b
Тут дальше лог с выводом типов, не то, чтобы это было доказательством, но, может, на что натолкнет:
Первым параметром мы можем подставить f a, получим Applicative f => f ((a->b)->b). Если обединить (pure (flip ($)) <*> a) с (b :: f (a->b)) путем применения <*>, то и получим f b.
Как-то так.
Порядок применения эффектов в Applicative f сохраняется.