2013-04-16 78 views
1

这可能是一个很不明显的例子,但请耐心等待。管道中的IO操作?

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

现在我正在查看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操作,因此无法执行我需要的操作,例如下载这些链接的页面。或者我可以吗?我能做些什么来解决这个问题?

回答

4

好吧我想通了....我想我需要的只是liftIO哈哈。对不起,我对Haskell有点新鲜:P

+1

这是一个好主意,将其标记为正确答案。 –