デフォルトでは、パイプはプル ベースです。これは、彼のプル カテゴリのポイントフルオペレータである>->
経由で実装されたオペレータによるものです。私の理解では、これは、のようなコードがある場合、コンシューマーの本体が最初に呼び出され、データを待機するとプロデューサーが呼び出されることを意味します。+>>
bind
producer >-> consumer
ここpipes
のドキュメントで、コードを使用してプル ベースのパイプをプッシュ ベースのパイプに変換できることを見てきました。つまり、上記のコードでは、プロデューサーが最初に実行され、値が生成され、次にコンシューマーが消費しようとします。それは本当に便利なようで、その方法を知りたいです。(reflect .)
Pipes.Core
producer >-> consumer
また、ここでの議論で>->
、パイプを好転させるのは簡単であるため (リフレクトを使用すると思いますか?)、プッシュ ベースの対応するものがないことを見てきましたが、その方法や例を見つけることはできません。
ここに私が試みたいくつかのコードがあります:
stdin :: Producer String IO r
stdin = forever $ do
lift $ putStrLn "stdin"
str <- lift getLine
yield str
countLetters :: Consumer String IO r
countLetters = forever $ do
lift $ putStrLn "countLetters"
str <- await
lift . putStrLn . show . length $ str
-- this works in pull mode
runEffect (stdin >-> countLetters)
-- equivalent to above, works
runEffect ((\() -> stdin) +>> countLetters)
-- push based operator, doesn't do what I hoped
runEffect (stdin >>~ (\_ -> countLetters))
-- does not compile
runEffect (countLetters >>~ (\() -> stdin))