3

我知道 Conduit 是一种解决流数据问题的解决方案,用于处理常量内存中的数据。

我在 hackage 中看到很多带有管道名称的库。一些例子是cvs-conduitzlib-conduitattoparsec-conduit等。

那么,如何制作一些基于普通库的管道呢?仅仅使用主管道 包,是否有资格解决流数据问题?

我试图深入研究 csv-conduit 的来源,它太复杂了。(比 RWH 书中实现的完整 csv 解析器大得多(大得多)。)此外,这个github 库实际上使用了 Conduit,那么它是否也可以处理恒定内存中的流数据?

4

1 回答 1

3

是的,主导管包几乎是您开始所需的一切。

这个想法是你在Conduits 中组织你的工作流程。把一些元素放进去——把一些元素推出去。在基本级别上,您只需使用awaitand就可以走得很远yield。只需在 monad 中使用它们,如下所示:

idConduit =
  do mElt <- await
     case mElt of
       Nothing -> return ()
       Just element ->
         do yield element
            idConduit

然后你把它们放在SinkSource喜欢之间mySink $= myConduit1 $= myConduit2 $$ mySource,你就完成了。

如果你想和他们一起阅读文件,attoparsec-conduit也可以试试。

于 2014-02-04T12:00:16.220 回答