2016-03-20 3 views
0

私は、次のコードを持っている: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内のすべてのファイルを印刷します。出力前に出力を並べ替えるにはどうすればよいですか?出力を最初にリストに流し込んだ後にソートする消費者を書く必要がありますか?私はパイプを使用しています - 4.1.4。

答えて

3

toListMPipes.Preludeは、プロデューサをリストに変換します。私たちは、その後pipesせずにそれを使用して進めることができます。

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

それとももう少しパイプ状の通常のモナド演算子を使用して:すべてのProducer内容をつかむ

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

は私たちに理由である外ストリーミング抽象化をもたらしますtoListMはパイプではなくプレーンなリストを返します。

1

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

関連する問題