@マイケルの答えは良いです。ここで行われている使用パターンをいくつか説明したいと思います。
( .lhs はhttp://lpaste.net/165352で入手可能)
最初のいくつかのインポート:
{-# LANGUAGE OverloadedStrings, NoMonomorphismRestriction #-}
import Pipes
import qualified Pipes.Prelude as PP
import qualified Pipes.Group as PG
import qualified Pipes.ByteString as PB
import qualified Pipes.GZip as GZip
import qualified Data.ByteString as BS
import Lens.Family (view, over)
import Control.Monad
import System.IO
Pipes.ByteString と Pipes.GZip の関数を調べると、それらがすべて次の型スキーマになっていることがわかります。
- プロデューサー ... -> FreeT (プロデューサー ...) ...
- FreeT (プロデューサー ...) ... -> プロデューサー ...
- Lens' (Producer ...) (FreeT (Producer ...) ...)
- プロデューサー ... -> プロデューサー ...
各カテゴリの機能の例:
PB.words
PG.concats
PB.lines
、PB.chunksOf
、PB.splits
、 ...
GZip.compress
、GZip.decompress
PB.words
入力ストリームを単語に分割するために使用する方法は次のとおりです。
prod = yield "this is\na test\nof the pipes\nprocessing\nsystem"
t1 = runEffect $ (PG.concats . PB.words) prod >-> PP.print
タイプ 3 の関数を使用するには、たとえばon
をPB.lines
使用してタイプ 1 の関数を取得し、次のように構成します。view
Lens'
PG.concats
t2a = runEffect $ (PG.concats . view PB.lines) prod >-> PP.print
t2b h = (PG.concats . view PB.lines) (PB.fromHandle h) >-> PP.print
run2 = withFile "input" ReadMode (runEffect . t2b)
Producer -> Producer 関数の場合は、通常の関数アプリケーションを使用してください:
t3 h = GZip.decompress (PB.fromHandle h) >-> PP.print
run3 = withFile "input.gz" ReadMode (runEffect . t3)
t4 h = GZip.decompress (PB.fromHandle h) >-> PP.map BS.length >-> PP.print
run4 = withFile "big.gz" ReadMode (runEffect . t4)
最初に解凍してから行ごとに分割するには、関数の適用をネストします。
t5 h = (PG.concats . view PB.lines) ( GZip.decompress (PB.fromHandle h) )
>-> PP.map BS.length >-> PP.print
run5 = withFile "input.gz" ReadMode (runEffect . t5)