
Hi Cale !
On 12/11/06, Cale Gibbard
The monad instance which is being used here is the instance for ((->) e) -- that is, functions from a fixed type e form a monad.
So in this case: liftM2 :: (a1 -> a2 -> r) -> (e -> a1) -> (e -> a2) -> (e -> r) I bet you can guess what this does just by contemplating the type. (If it's not automatic, then it's good exercise) Now, why does it do that?
Well, in general, liftM2 f x y = do u <- x v <- y return (f u v)
So, it runs each of the computations you give it to get parameters for f, and then returns the result of applying f to them.
[...]
Let us know if you need more detail about anything here. I sort of skipped over some details in the presentation. (You might want to work out exactly what return and bind do in this monad in order to understand things completely -- you can work them out from the types alone.)
Your answer was very thorough and very clear. I am honestly overwhelmed :D. Mind bending and rewarding. Thank you very much. I will be going through all your examples again slowly and with a console on the side so that I am sure I grok as much as I can. Regards, Nick