1

次のコードがあります。

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。印刷する前に出力をソートするにはどうすればよいですか? 最初に出力をリストに「排出」してからソートするコンシューマーを作成する必要がありますか? 私はpipes-4.1.4を使用しています。

4

2 に答える 2

4

toListMfromPipes.Preludeはプロデューサーをリストに変換します。pipesそれを使用して、後で続行できます。

runTest top = do
  ds <- P.toListM (getDC top >-> P.map (top</>))
  mapM_ print $ sort ds

または、通常のモナド演算子を使用して、もう少しパイプのようにします。

runTest top = P.toListM (getDC top >-> P.map (top</>)) >>= mapM_ print . sort

すべてのProducerコンテンツを取得すると、ストリーミングの抽象化の外に出ます。これtoListMが、パイプではなく単純なリストを返す理由です。

于 2016-03-20T17:16:12.743 に答える
1

はい、最初に出力を他の構造のリストに排出する必要があります。並べ替えは本質的に非ストリーミングです。たとえば、最後に入ってくる要素が最初に出ていくはずだからです。

于 2016-03-20T17:15:33.717 に答える