I am learning about the Writer Monad on the book Learn You A Haskell.
this is the piece of code:
import Control.Monad.Writer
logNumber :: Int -> Writer [String] Int
logNumber num = writer (num, ["Got number: " ++ show num])
multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
b <- logNumber 5
return (a * b)
When running multWithLog, this is the result:
*Main> runWriter multWithLog
(15,["Got number: 3","Got number: 5"])
On this lines:
a <- logNumber 3
b <- logNumber 5
It is easy to see that a = 3 and b = 5, since both of them are being multiplied on the return function.
What I don't understand is why those values are 3 and 5. Shouldn't a and b be the values that contain inside the Writer Monad? In this case tuples?
For example, with this was with the Maybe Monad, a and bwould be 3 and 5:
do
a <- Just 3
b <- Just 5
return (a * b)
In this case it makes sense to me, since a and b receive the content inside Just. But with the initial example, a and b only receive part of the value.
No. I think the simplest way to answer this is to just implement the
Writertype and study itsMonadclass instance:As you can see in the instance method for
>>=, the functionfis applied to theavalue, not the whole tuple. The syntaxa <- logNumber 3is desugared using>>=, so the value that's bound toawill be the first element of the tuple thatWriterwraps around.