我已经在多个地方读过列表的编写器monad将该完整列表保存在内存中,因此不应该用于除小样本之外的任何其他内容(例如,不记录日志).
但是,为了测试声明,我编写了以下程序,并且实际上表明它成功地输出了一个懒惰的无限列表!
import Control.Monad.Writer
createInfiniteList :: Int -> Writer [Int] ()
createInfiniteList i = do
tell [i]
createInfiniteList (i+1)
main :: IO ()
main = do
let x = execWriter $ createInfiniteList 1
print x
Run Code Online (Sandbox Code Playgroud)
我看过这个程序输出超过10亿个项目(它运行得非常快),并且监视我的机器上的内存使用率从未超过0.1%.
作家monad是否已被重写以修复原始问题?我可以指望它将来继续以这种方式工作吗?
注意 - 我知道存在更好的日志记录monad(我在其他地方使用它们)...我想要的用例不是日志记录(但它是类似的)