I'm trying to understand what is Haskell Reader monad, but I struggle with this part in the book:
The “read-only” nature of the type argument
rmeans that you can swap in a different type or value ofrfor functions that you call, but not for functions that call you. The best way to demonstrate this is with thewithReaderTfunction which lets us start a newReadercontext with a different argument being provided:withReaderT :: (r' -> r) -- ^ The function to modify the environment. -> ReaderT r m a -- ^ Computation to run in the modified environment. -> ReaderT r' m a
So, first of all, could you please specify what to consider "a function that you call" and what to consider "a function that call you"?
I think this is just an English language misunderstanding. When it says "you", it just means "the code you are currently concerned with".
If you are writing a function
myfunction:If we say that you are
myfunction, thensqrtis a function that you call, andmainis a function that calls you.The point the book is trying to make is that your code can call functions with any environment you want, but those functions can not change the environment for your code. In turn, code that calls your code can specify any environment it wants you to see, but you can not change the environment for that code.
Here's a commented example: