主要观点:在非平凡的 Haskell 程序中容易误用懒 I/O,Haskell 中的流库通过明确交错数据生成和效果执行来避免这些问题,并控制程序的内存使用。有多个流库可供选择,如conduit
、io-streams
、iteratee
、machines
、pipes
、streaming
和streamly
,其中conduit
、pipes
、streaming
和streamly
较为常用。
关键信息:
hGetContents
易被误用,IO
操作的数据生成和消耗难以预测。- 不同流库特点:
pipes
虽优雅但难写非平凡程序,类型签名复杂;conduit
设计有特点但处理非平凡任务时接口不够灵活;streamly
较新,有大胆性能宣称和统一工具集,但曾因文件监视函数更新导致工作程序出错;streaming
设计简单,通过Functor
参数增加功能,能实现一些其他库难以做到的操作。
重要细节:
pipes
中chunksOf
函数类型签名复杂,如chunksOf :: Monad m => Int -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x)
。conduit
的ConduitT
类型设计导致接口分裂,难以确定函数实现方式,如实现特定的rechunk
函数较困难。streaming
的核心类型Stream
和Of
,通过Functor
参数实现强大功能,如chunksOf
函数类型为chunksOf :: (Monad m, Functor f) => Int -> Stream f m r -> Stream (Stream f m) m r
,能轻松实现一些复杂操作,如在处理旧电脑游戏解压时能精确控制数据处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。