我有一个简单的任务 - 从文件中读取一堆行并对每一行执行一些操作。除了第一个 - 这是一些需要忽略的标题。
所以我想我应该尝试一下管道。
printFile src = runResourceT $ CB.sourceFile src =$=
CT.decode CT.utf8 =$= CT.lines =$= CL.mapM_ putStrLn
Cool.
所以现在我只想删除第一行......似乎有一个函数可以做到这一点 -
printFile src = runResourceT $ CB.sourceFile src =$=
CT.decode CT.utf8 =$= CT.lines =$= drop 1 =$= CL.mapM_ putStrLn
嗯 - 但现在我注意到 drop 有类型签名Sink a m ()
。有人向我建议我可以使用 Monad 实例作为管道,并使用 drop 来有效地删除一些元素 - 所以我尝试了这个:
drop' :: Int -> Pipe a a m ()
drop' n = do
CL.drop n
x <- await
case x of
Just v -> yield v
Nothing -> return ()
它不会进行类型检查,因为管道的 monad 实例仅适用于相同类型的管道 - 接收器将 Void 作为其输出,所以我不能像这样使用它。
我快速浏览了 Pipes 和 Pipes-Core,发现 Pipes-Core 具有我预期的功能,其中 Pipes 是一个最小的库,但文档显示了它的实现方式。
所以我很困惑 - 也许我缺少一个关键概念..我看到了这个功能
sequence :: Sink input m output -> Conduit input m output
但这似乎不是正确的想法,因为输出值为 ()
CL.sequence (CL.drop 1) :: Conduit a m ()
我可能会回去使用lazy-io,因为我真的不需要任何流媒体 - 但我有兴趣了解正确的方法。