ここに収まるライブラリ内のすべてのコンビネータを...そこにいないようですどちらも。
request
/respond
への引数は送信する値であり、バインドした結果はそれぞれ応答/要求です。これはrequest
(応答をバインドする)の直感的な意味を持ちますが、respond
(の次のリクエストをバインドする)をクリックするまで少し時間がかかりました。それはあなたの処理ステップをきれいに再帰的な機能にさせます。最初の本能はControl.Monad.forever
でしたが、一方向パイプの場合はうまくいきますが、間違ったツールです。
混乱を招くビット:パイプ自体が同期しているため、渡すために初期値を取得する必要があります物事をキックオフする。 ((>~>)
で構成するプルパイプラインを作成する)request
に渡すか、respond
((>+>)
で構成するプッシュパイプラインを作成)に渡します。次に、初期値を合成パイプラインに渡します。Effect m r
はrunEffect
になります。
APIリクエストメタファーに合っているので、私は以下の例でプルパイプラインを使用しました。これは、この三段双方向パイプラインを実装しています
+--------+ Yoken +-----------+ Token +--------+
| |<-------| |<-------| |
| server | | transform | | client |
| |------->| |------->| |
+--------+ String +-----------+ String +--------+
(shouty)
client
はToken
秒を要求生成し、応答を出力します。 transform
はToken
をYoken
に変換します(ちょっと、キーはお互いに隣り合っています)。それはまた、アップケーシングと!
を追加することによって応答を叫びに変えます。 server
はYoken
を受信し、要求された番号yo
を生成します。
import Data.Char
import Control.Monad
import Control.Monad.IO.Class
import Pipes.Core
import System.IO
data Token = Token Int
data Yoken = Yoken Int
main :: IO()
main = do
hSetBuffering stdout NoBuffering
-- We have to get an initial n outside the pipeline to kick things off.
putStr "N? "
n <- read <$> getLine
runEffect $ server >+> transform >+> client $ Token n
-- The "server" generates a string of "yo"s based on the number inside the Yoken
server :: Monad m => Yoken -> Server Yoken String m a
server (Yoken n) = (respond . concat $ replicate n "yo") >>= server
-- A processing step just for the sake of having one, turn the Token into a
-- Yoken, upcase the string, and append a "!".
transform :: Monad m => Token -> Proxy Yoken String Token String m a
transform (Token t) = do
resp <- request $ Yoken t
next <- respond $ map toUpper resp ++ "!"
transform next
-- Clients request "yo"s, by sending `Token`s upstream.
client :: Token -> Client Token String IO a
client t = do
resp <- request t
n <- liftIO $ putStrLn resp *> putStr "N? " *> fmap read getLine
client $ Token n
私の孤独な質問にお世話になりました。私はhttp://hackage.haskell.org/package/pipes-2.3.0/docs/Control-Proxy-Tutorial.htmlのおかげで自分自身で答えを見つけることができました – insitu