問題タブ [conduit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 複数の入力があるコンジットの融合
複数の入力ストリームを消費できるコンジットを作成しようとしています。入力ストリームのいずれかを特定の順序で (たとえば、交互に) 待機できるようにして、zip を役に立たなくする必要があります。ここでは、並列処理や非決定論的な処理は行われません。いずれかのストリームで待機します。次のようなコードを記述できるようにしたいと考えています (whereawaitA
とawaitB
await はそれぞれ 1 番目または 2 番目の入力ストリームで):
私が持っている最善の解決策は、内側のモナドを別のコンジットにすることです。
次に許可するもの
そして、これはほとんど機能します。残念ながら、これにより、外側の導管が完全に接続される前に、内側の導管に融合することが非常に困難になるようです。私が最初に試したのは:
しかし、少なくとも複数回実行され、毎回効果的に再起動されるx
ため、ステートフルな場合、これは機能しません。(x =$=)
x
コンジットの内部に侵入する以外に、fuseInner を記述する方法はありますか (これはかなり面倒なようです)。複数の入力ストリームを処理するためのより良い方法はありますか? コンジットが設計された目的をはるかに超えているのでしょうか?
ありがとう!
haskell - Data.Conduit.Utilのzipの必要性をなくす「より簡単な方法」は何ですか?
を始めてconduit
、Data.Conduit.Utilでそれに気づきました:
古いバージョンのコンジットのユーティリティ機能。ユースケースを処理する簡単な方法があるため、これらは非推奨と見なす必要があります。このモジュールは、下位互換性のためにのみ提供されています。
私にとって特に懸念されるのはですzip :: Monad m => Source m a -> Source m b -> Source m (a, b)
。これは私には非常に便利なようです。プロセスの早い段階で懸念事項を混ぜ合わせるのではなく、sを作成する方法とsを作成する方法を個別に作成しa
、必要なときにそれらを一緒に作成することができます。b
zip
しかし、私が言ったように、私は導管の方法で新しいので、私は無知です。これらの「ユースケースを処理するためのより簡単な方法」とは何ですか?
networking - Haskell: ネットワーク コンジットの「コールバック」に関する質問
私はネットワークコンジットとrunTCPServerを使用して、立ち往生したサーバーに電力を供給しています。
この場合:
プロトコルはどのくらいの頻度で実行されますか? クライアントソケットで頻繁に何かをタイムリーに実行したい場合、そのロジックをプロトコルに入れても安全ですか、それともデータが実際に到達するたびに呼び出されるだけですか?
コンジット「コールバック」の仕組みを説明していただければ幸いです。:)
よろしく。
networking - 1 つの処理コンジット、同じタイプの 2 つの IO ソース
GHC Haskell
stm、ネットワーク コンジット、およびコンジットを利用する私のアプリケーションでは、各ソケットにストランドがあり、これは を使用して自動的にフォークされますrunTCPServer
。ストランドは、ブロードキャスト TChannel を使用して他のストランドと通信できます。
これは、コンジット「チェーン」をセットアップする方法を示しています。
したがって、ここにあるのは 2 つのソース (それぞれがヘルパー コンジットにバインドされている) で、Packet
オブジェクトを生成します。このオブジェクトencoder
は、受け入れて に変換ByteString
し、ソケットを送信します。私は、2 つの入力を効率的に (パフォーマンスが懸念事項です) 融合するのに非常に苦労しました。
誰かが私を正しい方向に向けることができれば幸いです。
試みずにこの質問を投稿するのは失礼なので、以前に試したことをここに記載します。
TMChan (クローズ可能なチャネル) からソースを (ブロッキング) 生成する関数を作成/チェリーピックしました。
同様に、Chan をシンクに変換する関数。
次に、mergeSources は簡単です。2 つのスレッドをフォークして (これは本当にやりたくないのですが、一体何なのか)、それらの新しいアイテムを 1 つのリストに入れることができ、そのリストからソースを生成します。
これらの関数をタイプチェックすることには成功しましたが、これらの関数をタイプチェックに使用することには成功しませんでした。
とにかく、この方法には欠陥があると思います。多くの中間リストと変換があります。これでは、パフォーマンスが向上しません。ガイダンスを求めています。
PS。私が理解できることから、これはの複製ではありません。コンジットを複数の入力と融合します。私の状況では、両方のソースが同じ型を生成し、どちらのソースからPacket
オブジェクトが生成されたかは気にしません。
PPS。サンプル コードでのレンズの使用 (したがって、知識が必要) についてお詫び申し上げます。
haskell - コンジットモナドwhileJust_発行
Lens、Conduit、および Monad-Loops を利用する次の Haskell コードを検討してください。
大量のリフティングを通じて、次の型エラーを解決できませんでした。
いくつかのガイダンスやアドバイスをいただければ幸いです。processBroadcast
処理のためにセッションによって運ばれる状態が必要であることに注意してください。
モナドループのドキュメント: http://hackage.haskell.org/packages/archive/monad-loops/0.4.2/doc/html/Control-Monad-Loops.html
コンジット ドキュメント: http://hackage.haskell.org/packages/archive/conduit/1.0.6/doc/html/Data-Conduit.html
stm (TChannel) ドキュメント: http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TChan.html
haskell - コンジットの入力の終わりを検出する方法は?
(パッチを適用した) HaskellNet のIMAPのバックエンドとしてnetwork-conduitを使用しようとしています。必要な操作の 1 つは、ストリームが開いているかどうかを検出することです。現在、私は使用しています
これは正しいですか、それとももっと良い方法がありますか?
haskell - コンジットから異なるチャンクを読み取る方法 (たとえば、LF までの行、次に 10 バイト)?
1 つのネットワーク プロトコルについて、さまざまな種類のチャンクをSource m ByteString
. 入力を行に分割するコンビネータがありlines
ますが、読み取り行と固定数のバイトを組み合わせることができる必要があります。
私の現在のアプローチは、ヘルパー関数を作成することです。
| | 入力で指定された関数を折りたたみます。関数が戻るまで繰り返し、
Left
その結果をリストに蓄積します。関数が を返したらRight
、累積された結果 (最後の結果を含む) を連結して返し、 を使用して残ったものを格納しleftover
ます。Nothing
入力が利用できない場合に戻ります。
この関数を使用して、特定のコンシューマーを作成します。
より良い方法はありますか?この問題はどこかですでに解決されているはずです。