我正在学习Writer Monad的书“学习你一个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
和5
。 a
和b
是否应该包含在Writer
Monad中的值?在这种情况下元组?
例如,这是与Maybe
单子,a
和b
将3
和5
:
do
a <- Just 3
b <- Just 5
return (a * b)
在这种情况下,对我来说很有意义,因为a
和b
收到内部Just
内容。但以最初的例子,a
和b
只接收部分值。
当您在'Writer' monad中执行'x <-e'时,'x'通常不会捕获编写器状态。您可以将logNumber重写为“logNumber num = tell”...“>> return num” - 这是一个计算结果,它产生的数字与它给出的数字相同,但作为副作用“记录”了一个字符串。当你“绑定”你正在访问“返回”的值 - 这只是数字。你可以用'listen'得到想要的行为:'(x,loggedString)< - listen $ logNumber 3'。 – user2407038