instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
a <- (*2)
b <- (+10)
return (a+b)
I'm trying to understand this monad by unwiding the do notation, because I think the do notation hides what happens.
If I understood correctly, this is what happens:
(*2) >>= (\a -> (+10) >>= (\b -> return (a+b)))
Now, if we take the rule for >>=
, we must understand (*2)
as h
and (\a -> (+10) >>= (\b -> return (a+b)))
as f
. Applying h
to w
is easy, let's just say it is 2w
(I don't know if 2w
is valid in haskell but just for reasoning lets keep it this way. Now we have to apply f
to h w
or 2w
. Well, f
simply returns (+10) >>= (\b -> return (a+b))
for an specific a
, which is 2w
in our case, so f (hw)
is (+10) >>= (\b -> return (2w+b))
. We must first get what happens to (+10) >>= (\b -> return (2w + b))
before finally applying it to w
.
Now we reidentify (+10) >>= (\b -> return (2w + b))
with our rule, so h
is +10
and f
is (\b -> return (2w + b))
. Let's first do h w
. We get w + 10
. Now we need to apply f
to h w
. We get (return (2w + w + 10))
.
So (return (2w + w + 10))
is what we need to apply to w
in the first >>=
that we were tyring to uwind. But I'm totally lost and I don't know what happened.
Am I thinking in the rigth way? This is so confusing. Is there a better way to think of it?