4

複数のパイプを 1 つにマージすること、またはその逆は可能ですか?

次の機能の実装に苦労しています。

merge :: (Monad m) => [Pipe l i o u m r] -> Pipe [l] [i] [o] m [r]

split :: (Monad m) => Pipe [l] [i] [o] m [r] -> [Pipe l i o u m r]
4

2 に答える 2

3

あなたのコメントから、いくつかのシンクを連鎖させるだけで、あなたがやろうとしていることをより簡単に達成できるように思えます:

import Data.Conduit
import Data.Serialize.Put (putListOf, putWord32le)
import qualified Data.Conduit.Binary as Cb
import qualified Data.Conduit.List as Cl
import qualified Data.Conduit.Cereal as Cc

main :: IO ()
main = do
  let source = Cl.sourceList [[1,2,3],[4,5,6],[7,8,9]]
      encoder = Cc.conduitPut $ putListOf putWord32le

  runResourceT . runPipe $ source >+> do
    Cl.isolate 1 >+> encoder >+> Cb.sinkFile "/tmp/1.bin"
    Cl.isolate 1 >+> encoder >+> Cb.sinkFile "/tmp/2.bin"
    Cl.isolate 1 >+> encoder >+> Cb.sinkFile "/tmp/3.bin"
    Cl.sinkNull
于 2013-01-31T17:20:47.937 に答える
1

他の人がコメントしているように、パイプのマージにはさまざまなセマンティクスがあります。

pipes-core(Gabriel Gonzalez のpipesライブラリの Paolo Capriotti のフォーク。これは のような iteratee の別の実装ですconduit) には、単項および乗法カテゴリの非常に一般的なコードがいくつかあることを知っています。

http://hackage.haskell.org/packages/archive/pipes-core/0.1.0/doc/html/Control-Pipe-Category.html#t:PipeC

たとえばPipeC、型変数を移動しPipeC m rて有効なカテゴリを作成する newtype を使用すると、セットの独立したシグナルをEithers として多重化できます。

インスタンスsequence全体に適用されるようなものもあります。Monad

sequence :: [m a] -> m [a]

これにより、さまざまなパイプが「垂直に」(1 つが実行されてから次が実行されます)シーケンスされ、次のようなものを記述できます(Control.Pipe.PipeGonzalez のpipesパッケージを使用)

takeNPipe :: Int -> Pipe a b m [a]
takeNPipe n = sequence (replicate n await)

あなたが求めているタイプは、これらの種類の「マージ」の両方を同時に意味します。並列 (多重化) 構成と順次 (垂直) 構成の両方を一度に必要とするため、これは (私が信じている) 不可能です。

于 2013-01-30T23:35:44.403 に答える