我正在《Learn You A Haskell》一书中了解 Writer Monad。
这是一段代码:
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)
运行时multWithLog
,结果如下:
*Main> runWriter multWithLog
(15,["Got number: 3","Got number: 5"])
在这行:
a <- logNumber 3
b <- logNumber 5
很容易看出a = 3
和b = 5
,因为它们都在return
函数上相乘。
我不明白为什么这些值是3
and 5
。不应该是包含在Monada
中的值吗?在这种情况下元组?b
Writer
例如, with this is with the Maybe
Monad,a
并且b
将是3
and 5
:
do
a <- Just 3
b <- Just 5
return (a * b)
在这种情况下,这对我来说是有意义的,因为a
并b
接收里面的内容Just
。但与最初的例子相比,a
只b
收到了部分价值。