我正在 Haskell 中尝试一个小实验,想知道是否可以利用惰性来处理 IO。我想编写一个函数,它接受一个字符串(字符列表)并惰性地生成一个字符串。然后我希望能够从 IO 延迟地向其提供字符,因此每个字符一旦可用就会被处理,并且当必要的字符可用时将产生输出。但是,我不太确定是否/如何可以从 IO monad 内的输入生成一个惰性字符列表。
最佳答案
Haskell 中的常规字符串 IO 是惰性的。所以你的例子应该开箱即用。
这是一个使用“interact”函数的示例,它将函数应用于惰性字符流:
interact :: (String -> String) -> IO ()
让我们从输入流中懒惰地过滤掉字母“e”(即在恒定空间中运行):
main = interact $ filter (/= 'e')
如果您愿意,还可以使用 getContents 和 putStr。他们都很懒。
运行它从字典中过滤字母“e”:
$ ghc -O2 --make A.hs
$ ./A +RTS -s < /usr/share/dict/words
...
2 MB total memory in use (0 MB lost due to fragmentation)
...
因此我们看到它的运行占用空间恒定为 2M。
关于haskell - Haskell 中的 "Lazy IO"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290164/