функции как аппликативные функторы (Haskell/LYAH)

Глава 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.

Я понимаю, что это грязно, так что спасибо, что терпите меня.

36
задан planarian 4 August 2012 в 18:07
поделиться