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操作,因此无法执行我需要的操作,例如下载这些链接的页面。或者我可以吗?我能做些什么来解决这个问题?
这是一个好主意,将其标记为正确答案。 –