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)
fmap or just function composition
ap if you know how it behaves on monads.