2013-04-16 74 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

這是一個好主意,將其標記爲正確答案。 –