我有以下代码:
import Control.Monad (unless)
import Pipes
import qualified Pipes.Prelude as P
import System.FilePath.Posix ((</>))
import System.Posix.Directory (DirStream, openDirStream, readDirStream)
produceFiles :: DirStream -> Producer FilePath IO ()
produceFiles ds = do
path <- lift $ readDirStream ds
yield path
unless (path == "") $ produceFiles ds
getDC :: FilePath -> Producer FilePath IO ()
getDC top = do
ds <- lift $ openDirStream top
produceFiles ds
runTest top = runEffect $ getDC top >-> P.map (top</>) >-> P.stdoutLn
它打印目录top
中的所有文件。如何在打印前对输出进行排序?我是否需要写一个消费者&#34;排水&#34;首先将输出放入列表然后对其进行排序?我使用pipe-4.1.4。
答案 0 :(得分:3)
Pipes.Prelude
的 toListM
将制作人转换为列表。我们可以使用它,然后在没有pipes
的情况下继续:
runTest top = do
ds <- P.toListM (getDC top >-> P.map (top</>))
mapM_ print $ sort ds
或者使用通常的monadic运算符更像管道:
runTest top = P.toListM (getDC top >-> P.map (top</>)) >>= mapM_ print . sort
抓取所有Producer
内容会将我们带到流外抽象,这就是toListM
返回普通列表而不是管道的原因。
答案 1 :(得分:1)
是的,您需要先将输出排出,或者列入我们的其他结构列表。排序本质上是非流式的,因为它可能是,例如,进入的最后一个元素应该是第一个出去。