haskell - Haskell 中的 "Lazy IO"?

标签 haskell io lazy-evaluation

我正在 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/

相关文章:

haskell - nubBy 没有按预期工作

java - 缓冲的 RandomAccessFile java

haskell - 始终保证`seq`的评估顺序(此外还有`pseq`的奇怪行为)

android延迟加载不在手机上显示图像或显示并且速度很慢

haskell - Haskell 中的游戏服务器

haskell - 使用列表优雅地实现 n 维矩阵乘法?

haskell - 修改 monad 状态

haskell - 将可能性添加到 Haskell 数据类型(使用记录语法)

tomcat - 当 Tomcat(嵌入式)服务器变慢并最终变得无响应时,最常见的原因是什么

c++ - fstream对象默认关联