管道中的IO操作?

时间:2013-04-16 07:16:08

标签: haskell conduit

这可能是一个相当模糊的案例,但请耐心等待。

我正在编写一个需要下载网页并将其保存到本地磁盘的网络抓取工具。同时,作为一个爬虫,它需要在每个页面上找到超链接并下载这些链接的页面。

现在我正在查看this page上给出的第一个示例代码。我正在尝试编写这种类型的管道:

processLink :: Conduit S.ByteString IO S.ByteString

然后我将在示例代码中替换此行:

responseBody res $$+- sinkFile "foo.txt"

这一行:

responseBody res $= processLinks $$+ sinkFile

所以我要做的是实现一个名为processLink的管道,它管理一个ByteString,从中引出链接,然后将原始的ByteString传递给sinkFile,以便保存页面。然后我可以递归地调用这些链接上的函数来下载这些链接的页面。

但是,由于processLink是一个纯函数,似乎我无法在processLink中执行任何IO操作,因此无法完成下载这些链接页面所需的操作。或者我可以吗?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

好吧我明白了......我想我需要的只是liftIO lol。对不起,我是Haskell的新手:P