デフォルトでは、パイプはプルベースです。これは、オペレータ>->
が+>>
によって実装されているためです。これは、彼のプルカテゴリの点数がbind
です。私が理解していることは、producer >-> consumer
のようなコードがあれば、消費者の身体が最初に呼び出され、データを待ってからプロデューサが呼び出されるということです。プッシュベースのパイプをプッシュベースのパイプに変換するにはどうすればいいですか?
私はあなたがプッシュベースのパイプにプルベースのパイプをオンにするPipes.Core
からコード(reflect .)
を使用することができますpipes
ドキュメントhereで見てきました。つまり、コードがproducer >-> consumer
を超えると、プロデューサが最初に実行され、値が生成され、次にコンシューマが消費しようとします。それは本当に便利だと私はそれを行う方法を知りたいです。
>->
へのプッシュベースの対応はありませんが、私は実際にそれを行う方法を見つけ出すことはできませんという議論
hereで見てきた
か例を見つける。私はプロデューサーが最初の予想通りに走っている間に、最初に生成される値が低下している、ということですここで問題を収集
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))