問題タブ [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.

0 投票する
1 に答える
98 参照

haskell - Control.Framesを「垂直にスタック」する方法は?

pipesパッケージのチュートリアル[ 1]は、モナド演算子Control.Pipes.Tutorialを使用してパイプコンポーネントを「垂直にスタック」する方法を示しています。>>

Control.Frameでそれを行うにはどうすればよいですか?

たとえば、Control.Frameチュートリアルの定義を使用します。

>>ここでforを使用し???ても、タイプチェックは行われません。

[1] http://hackage.haskell.org/packages/archive/pipes/latest/doc/html/Control-Pipe-Tutorial.html#g:4

更新:これが私が試したことのペーストです:http://hpaste.org/77986

問題のようです-上記の貼り付けcloseの関数を参照してください。明示的に指定しない場合、bar8フレームは構成可能です。もちろん、私は最終的にそれらを閉じる必要があります。うーん...>>close

0 投票する
2 に答える
909 参照

haskell - Iteratees と FRP の関係は何ですか?

二つの考えの間には強いつながりがあるように私には思えます。私の推測では、Iteratees で任意のグラフを表現する方法があれば、FRP は Iteratees の観点から実装できると思います。しかし、私の知る限り、彼らはチェーンのような構造しかサポートしていません。

誰かがこれに光を当てることができますか?

0 投票する
1 に答える
928 参照

haskell - pipes 3.0 : 非線形トポロジー

ストリーム処理用のパイプ 3.0 パッケージを見ています。チュートリアルは非常によくできており、非常に明確ですが、「zip とマージ」セクションに頭を悩ませることはできません。

私の目標は、ArrowChoice のようにパイプを組み合わせることです。

  • 私はどちらかのaaのユニークなプロデューサーを持っています
  • 最初のパイプを左の値に適用し、別のパイプを右の値に適用したい
  • 次に、結果をマージして、パイプを続行したいと思います

forkチュートリアルのように定義します:

問題は、型を正しく作成できないことです。チュートリアルは、内部の (リフトされた) パイプ チェーンを自己完結型のセッションとして実行する方法を示しているだけのようですが、パイプに効果を適用するだけでなく、その値をパイプに再注入できるようにしたいと考えています。もちろん、私はタイプをフォローしようとしましたが、すぐに毛むくじゃらになってしまいます。

誰でもこれについて私を助けることができますか? 前もって感謝します。

(PS: この種のトポロジーの例は、チュートリアルに追加するのに適しています。または、Control.Arrowパイプを使用してエミュレートする方法に関するセクションがさらに適しています)

0 投票する
2 に答える
594 参照

haskell - パイプのWriterPを使用して単純なアキュムレータを作成する

パイプライブラリを使用して、あるソースからデータを読み取り、それをモノイド的に蓄積するプログラムを作成したいと思います(たとえば、を使用してSum)。これを行う最も簡単な方法は、

もちろん、これは小さなソースでは機能しますが、大きな入力は、WriterTアキュムレータの怠惰な性質のために恐ろしいスタックオーバーフローを引き起こします。

ありがたいことに、これはpipesこれを予期しているようで、WriterPプロキシに厳密なアキュムレータを提供します。残念ながら、このプロキシを取り巻くドキュメントはかなりまばらです。少し突っ込んだ後(そして問題を単純化して、代わりにダウンストリーム要素ごとに1を累積する)、私はこのプログラムに行きました、

もちろん、このプログラムは、6ではなく1に累積されるため、簡略化されたタスクを正しく実行しません。私が間違っていない場合、この動作は、パイプが終了する前に1つの要素のみを読み取るという事実によって説明されます。入力が終わるまで繰り返すために、私は次のことを思いついた、

ただし、このコードはアキュムレータ0を返します。これはなぜですか?私のような機能はありfoldますpipesか?

の多くのユースケースpipesが大規模なデータセットを処理する長時間実行プロセスであることを考えると、フォールドインを厳密ではなくControl.Proxy.Prelude厳密に構築することは意味がありませんか?現在、のプロキシトランスフォーマーは二流市民であり、存在しているように感じますが、非常に便利なコンビネータの多くが不足しています。WriterPWriterTpipesWriterT

0 投票する
3 に答える
504 参照

haskell - ベースモナドでプロキシと異なるEitherTを組み合わせる

たとえば、...

...どうすればこれを機能させることができますか?

注:でミキシングベースモナドを読みましたControl.Proxy.Tutorial。最初の例を取得しましたが、考案された例を理解できません。より多くの例は、それほど明白ではありませんが、それほど工夫されていないので、ベースモナドの任意の組み合わせの使用方法hoistと一致方法を明確にする可能性があります。lift

0 投票する
2 に答える
359 参照

haskell - コンジットのアップストリーム型パラメータの本当の利点は何ですか?

パイプの概念のさまざまな実装の違いを理解しようとしています。コンジットパイプの違いの 1 つは、パイプを融合する方法です。コンジット

パイプが持っている間

私が正しく理解している場合、pipesでは、2 つのパイプのいずれかが停止すると、その結果が返され、もう一方が停止します。コンジットでは、左のパイプが終了すると、その結果が下流の右のパイプに送信されます。

私は、conduitのアプローチの利点は何だろうか? コンジットおよびを使用して実装するのは簡単ですが、パイプおよび>+>を使用して実装するのは(より)難しい例(できれば実世界)を見たいと思います。>->

0 投票する
2 に答える
1190 参照

haskell - コンジットの残り物の利点は何ですか?

コンジットパイプの違いを理解しようとしています。パイプとは異なり、コンジットには残り物の概念があります。残り物は何に役立ちますか?残り物が不可欠な例をいくつか見てみたいと思います。

そして、パイプには残り物の概念がないので、それらと同様の動作を実現する方法はありますか?

0 投票する
2 に答える
818 参照

parsing - pipes-attoparsec の「サブパーサー」

Haskell で pipes-attoparsec を使用してバイナリ データを解析しようとしています。パイプ (プロキシ) が関与する理由は、読み取りと解析をインターリーブして、大きなファイルで大量のメモリを使用しないようにするためです。多くのバイナリ形式はブロック (またはチャンク) に基づいており、そのサイズは多くの場合、ファイル内のフィールドによって記述されます。このようなブロックのパーサーが何と呼ばれているかはわかりませんが、タイトルの「サブパーサー」とはそういう意味です。私が抱えている問題は、潜在的に大きなメモリフットプリントなしで簡潔な方法でそれらを実装することです. それぞれが何らかの点で失敗する 2 つの代替案を思いつきました。

代替案 1 は、ブロックを別のバイト文字列に読み込み、それに対して別のパーサーを開始することです。簡潔ではありますが、ブロックが大きいとメモリ使用量が高くなります。

代替案 2 は、同じコンテキストで解析を続け、消費されたバイト数を追跡​​することです。この追跡はエラーが発生しやすく、最終的な blockParser を構成するすべてのパーサーに感染しているようです。不正な形式の入力ファイルの場合、追跡されたサイズを比較する前に、サイズ フィールドで示されるよりもさらに解析することで時間を浪費することもあります。

0 投票する
2 に答える
1146 参照

haskell - Haskell パイプと分岐

問題

Haskell と Pipes ライブラリを使用して単純な Web サーバーを実装しようとしています。循環トポロジーまたはダイヤモンド トポロジーはパイプでは不可能であることを理解しましたが、私がしようとしているのはそうであると思いました。したがって、私の望ましいトポロジは次のとおりです。

チェーンで使用するタイプがありますHTTPRequest RequestLine Headers Message。は、ソケットからバイトを受け取り、Attoparsec を使用してバイトをオブジェクトに解析する に転送します。次に、実装する HTTP メソッドの数に応じて、パイプが少なくとも 2 回、場合によってはそれ以上分岐するようにします。各関数は、アップストリームからオブジェクトを受信し、オブジェクトをに転送する必要があります。これにより、HTTPResponse オブジェクトが で送信できるようにまとめられます。HTTPResponse StatusLine Headers MessagesocketReadSparseRequestHTTPRequesthandle<method>HTTPRequestHTTPResponsepackRequestByteStringsocketWriteS

次のコードは、GHC に型を推論させるかどうかを型チェックrouteRequest'''します (私のものは少しずれているようです)。ただし、 の後に何も実行されていないようparseRequestです。誰でも理由を理解するのを手伝ってもらえますか?

コード

routeRequest分岐を処理する必要がある次のコードがあります。

handleGETそしてhandlePOST、そのように実装されています:

プロキシの略記は次のとおりです。

最後に、次のように全体を実行します。

の型シグネチャparseRequestProxyは次のとおりです。

編集

ソースコードのリポジトリはこちら。加工はしておりませんので、ご利用は自己責任でお願いします。https://bitbucket.org/Dwilson1234/haskell-web-server/overview