Глава 11 "Изучение вас" 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
.
Я понимаю, что это беспорядочно, так что спасибо за то, что он со мной.