我正在學習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