Глава 11 книги Learn You a Haskell вводит следующее определение:
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
Здесь автор делает какой-то нехарактерный жест рукой -взмахивает («Реализация экземпляра для < *> немного загадочна, так что будет лучше, если мы просто [покажем это в действии без объяснений]» ). Я надеюсь, что кто-то здесь может помочь мне понять это.
Согласно определению аппликативного класса(<*>) :: f (a -> b) -> f a -> f b
В этом случае, заменив ((->)r)
наf
:r->(a->b)->(r->a)->(r->b)
Итак, первый вопрос: как перейти от этого типа к f <*> g = \x -> f x (g x)
?
Но даже если я приму эту последнюю формулу как должное, мне будет трудно привести ее в соответствие с примерами, которые я привожу для GHCi. Например:
Prelude Control.Applicative> (pure (+5)) <*> (*3) $ 4
17
Вместо этого это выражение кажется совместимым сf <*> g = \x -> f (g x)
(обратите внимание, что в этой версии x
не появляется после f
.
Я понимаю, что это грязно, так что спасибо, что терпите меня.