我正在尝试使用 Pipes 写一个网络爬虫,目前遇到跟随抓取链接的部分。我有一个 process
函数,可以下载 URL、查找链接并生成链接迭代器。
process :: Pipe Item Item (StateT CState IO) ()
....
for (each links) yield
....
现在我想以某种方式递归地跟随这些链接,并将StateT线程化。我意识到,可能有比使用单个管道进行大部分爬虫更符合惯用语的做法(特别是当我开始添加更多功能时),我愿意听取建议。无论如何,当考虑具有共享状态的多线程时,我可能不得不重新思考设计。
process :: (MonadState CState m, MonadIO m) => Pipe Item Item m ()
。这样不会有太多代码变动(可能),更易读,并且抽象了你的单子栈的实现细节。 - Alec