- A+

I am currently reading Learn You a Haskell for Great Good! and am stumbling on the explanation for the evaluation of a certain code block. I've read the explanations several times and am starting to doubt if even the author understands what this piece of code is doing.

`ghci> (+) <$> (+3) <*> (*100) $ 5 508 `

An applicative functor applies a function in some context to a value in some context to get some result in some context. I have spent a few hours studying this code block and have come up with a few explanations for how this expression is evaluated, and none of them are satisfactory. I understand that (5+3)+(5*100) is 508, but the problem is getting to this expression. Does anyone have a clear explanation for this piece of code?

It is using the applicative instance for functions. Your code

`(+) <$> (+3) <*> (*100) $ 5 `

is evaluated as

((/a->b->a+b)<$>(/c->c+3)<*>(/d->d*100)) 5 ( (/x ->(/a->b->a+b)((/c->c+3)x)) <*>(/d->d*100)) 5 ( (/x ->(/a->b->a+b)(x+3)) <*>(/d->d*100)) 5 ( (/x -> b -> (x+3)+b) <*>(/d->d*100)) 5 ((/x->b->(x+3)+b)<*>(/d->d*100)) 5 (/y -> ((/x->b->(x+3)+b)y) ((/d->d*100)y)) 5 (/y -> (b->(y+3)+b) (y*100)) 5 (/y -> (y+3)+(y*100)) 5 (5+3)+(5*100)

where `<$>`

is `fmap`

or just function composition `.`

, and `<*>`

is `ap`

if you know how it behaves on monads.