Today, I am trying to understand the (->) monad ... not so easy without any example available.
1. The Monad (->)
(->) is an instance of Monad. In Control.Monad.Instances you can read the definition of
So, a monadic value m a for this monad is a function r -> a since m is (->) r
The bind operator is defined with:
Where f has type r -> a and k has type a -> (r -> b)
How can we understand this ? This is a Reader monad ! f is a computation returning a value of type a for a given environment of type r.
k is a function whose result is dependent on the current environment of type r.
The bind operator is computing the combination of both computations in the same environment.
So, we have computation implicitly parametrized by an environment of type r.
But, this monad is not just a Reader monad. It is a specific kind of Reader monad and its monadic values can also be seen as a family of objects parametrized by a coordinate of type r.
The Functor fmap is just applying a function to the family and it is equivalent to the function composition.
But, the bind operator is more difficult to understand if we choose this point of view.
If k had the type r -> (a -> b) then it would be easy. The bind would just apply a family of functions to a family of objects.
But, we could no more chain the functions since the bind opeartor is expecting another type.
Using the function flip, I can transform that type into the one needed by the bind operator. Then, I can give a meaning to:
And, each time I have
I can transform it into
so I assume that saying the bind operator is applying a family of functions to a familly of objects is an acceptable interpretation ?
(This post was imported from my old blog. The date is the date of the import. The comments where not imported.)