Haskell Pipes:如何对生产者的输出进行排序?

时间:2016-03-20 16:49:51

标签: haskell haskell-pipes

我有以下代码:

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。

2 个答案:

答案 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)

是的,您需要先将输出排出,或者列入我们的其他结构列表。排序本质上是非流式的,因为它可能是,例如,进入的最后一个元素应该是第一个出去。