問題タブ [haskell-pipes]
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 - MonadIO を実装する Monad 内に async を埋め込む
pipes-concurrency
次のようなコードがあります。
質問 1 : これは明らかにコンパイルされませrunEffect
ん。これを行う方法はありますか?それとも、パイプラインが IO モナド内にエフェクトを含めるように強制するのに行き詰まっていますか?MonadIO m => m ()
async
IO a
質問 2 : MonadIO を実装する Monad 内に async を埋め込むことは理にかなっていますか? ここで自分自身をうまく表現できているかどうかはわかりません。
ありがとうございました!
haskell - パイプ内でコンシューマーを実行する
コンシューマーの出力がパイプの入力に供給されるように、コンシューマーとパイプを構成する必要があります。
これは、次のようなコンビネータで解決できると思います。
またはこれ:
または次のようなリフティング関数:
またはこのように:
consumer >~ pipe
私は成功せずにやってみました。では、これにどのようにアプローチするのですか?
loops - MonadPlus が「ジェネレータ」クラスである場合、「コンシューマ」クラスは何ですか?
Aは、ジェネレーター部分 ( ) とコンシューマー部分 ( )Pipe
の 2 つの部分に分けることができます。yield
await
Pipe
ジェネレーターの半分のみを使用し、返すだけ(または決して返さない) がある場合()
、それは「ListT
正しく行われた」として表すことができます。ListT MonadPlus
-done-right のようなものを表すために使用できることがわかりました。ガブリエル・ゴンザレスの引用:
ListT
トランスフォーマーの依存関係のみを使用して、(パイプ内のものだけでなく)任意のものを構築できることに注意してください。たとえば、 のListT
アナログを実装する方法は次のPipes.Prelude.stdinLn
とおりです。それはそこにあるものと同じようにチェックを入力
ListT
し、それらすべてに対して正しいことを行います。
だから私の質問はこれです:パイプのコンシューマー部分にデュアルがListT
ありますか?MonadPlus
要件:
yield
を使用せず、返すだけ()
(または決して返さない) であるが、使用するパイプは、await
この「ListT のデュアル」として表すことができます。- 「ListT の双対」は「MonadPlus の双対」に一般化できます。
haskell - Haste と Haskell でパイプを使用してスリープする
Pipes ライブラリを多用する Haskell プログラムに取り組んでいます。ライブラリの一部をHasteに移植しています。私がつまずきにぶつかった場所の 1 つは、javascript がスリープ状態を処理する奇妙な方法です。
私が書きたかったのは、結果を送信する前に遅延する単純なパイプでした
ただし、スリープはコールバックのように機能するようです。
やってみた
しかし、タイプは適切に並んでいません。遅延パイプを取得する方法はありますか?
haskell - パイプと非パイプ コード間の同時実行に関する考慮事項
私は、パイプ インターフェイスでのエンコーディング用に C ライブラリをラップしている最中ですが、いくつかの設計上の決定を行う必要があることに気付きました。
C ライブラリがセットアップされた後、エンコーダ コンテキストを保持します。これにより、いくつかのパラメーターをエンコードまたは変更できます (この最後の関数への Haskell インターフェースを呼び出しましょうtune :: Context -> Int -> IO ()
)。私の質問には2つの部分があります:
- エンコーディング部分は で簡単にラップできますが、
Pipe Foo Bar IO ()
も公開したいと思いtune
ます。エンコーディング コンテキストの同時使用はロックで保護する必要があるため、パイプ内の反復ごとにロックをtune
取得し、同じロックを取得して保護する必要があります。しかし今、ユーザーに隠しロックを強制しているように感じます。ここで間違ったツリーを吠えていますか? この種の状況は通常、パイプのエコシステムでどのように解決されますか? 私の場合、特定のコードが含まれるパイプは常に独自のスレッドで実行され、同時にチューニングが行われることを期待していますが、この観点をユーザーに強制したくありません。パイプエコシステムの他のパッケージは、ユーザーにどちらかを強制することはないようです。 - 使用されなくなったエンコーディング コンテキストは、適切に初期化解除する必要があります。パイプのエコシステムでは
IO
、パイプが破壊されたときにそのようなこと (この場合はいくつかのアクションを実行すること) が確実に処理されるようにするにはどうすればよいでしょうか?
具体的な例は、圧縮ライブラリをラップすることです。この場合、上記は次のようになります。
- 圧縮強度は調整可能です。パイプを設置すると、楽しそうに流れていきます。圧縮コーデック コンテキストへの同時アクセスをシリアル化する必要があると仮定すると、パイプの実行中に圧縮強度の設定を変更できるようにするにはどうすればよいでしょうか?
- 圧縮ライブラリは、セットアップ時に Haskell ヒープから大量のメモリを割り当てました。パイプが破棄されたときに、ライブラリ関数を呼び出してこれをクリーンアップする必要があります。
ありがとう…これはすべて明白かもしれませんが、私はパイプのエコシステムにまったく慣れていません。
編集:投稿後にこれを読んで、これが私が今までここで尋ねた中で最も漠然とした質問だと確信しています. うーん!ごめん ;-)