Applicative functor evaluation is not clear to me

前端 未结 4 484
不思量自难忘°
不思量自难忘° 2020-12-02 01:29

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 severa

4条回答
  •  心在旅途
    2020-12-02 01:49

    Let us first take a look how fmap and (<*>) are defined for a function:

    instance Functor ((->) r) where
        fmap = (.)
    
    instance Applicative ((->) a) where
        pure = const
        (<*>) f g x = f x (g x)
        liftA2 q f g x = q (f x) (g x)
    

    The expression we aim to evaluate is:

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

    or more verbose:

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

    If we thus evaluate (<$>), which is an infix synonym for fmap, we thus see that this is equal to:

    (+) . (+3)
    

    so that means our expression is equivalent to:

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

    Next we can apply the sequential application. Here f is thus equal to (+) . (+3) and g is (*100). This thus means that we construct a function that looks like:

    \x -> ((+) . (+3)) x ((*100) x)
    

    We can now simplify this and rewrite this into:

    \x -> ((+) (x+3)) ((*100) x)
    

    and then rewrite it to:

    \x -> (+) (x+3) ((*100) x)
    

    We thus have constructed a function that looks like:

    \x -> (x+3) + 100 * x
    

    or simpler:

    \x -> 101 * x + 3
    

    If we then calculate:

    (\x -> 101*x + 3) 5
    

    then we of course obtain:

    101 * 5 + 3
    

    and thus:

    505 + 3
    

    which is the expected:

    508
    

提交回复
热议问题