問題タブ [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 - 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
haskell - Iteratees と FRP の関係は何ですか?
二つの考えの間には強いつながりがあるように私には思えます。私の推測では、Iteratees で任意のグラフを表現する方法があれば、FRP は Iteratees の観点から実装できると思います。しかし、私の知る限り、彼らはチェーンのような構造しかサポートしていません。
誰かがこれに光を当てることができますか?
haskell - pipes 3.0 : 非線形トポロジー
ストリーム処理用のパイプ 3.0 パッケージを見ています。チュートリアルは非常によくできており、非常に明確ですが、「zip とマージ」セクションに頭を悩ませることはできません。
私の目標は、ArrowChoice のようにパイプを組み合わせることです。
- 私はどちらかのaaのユニークなプロデューサーを持っています
- 最初のパイプを左の値に適用し、別のパイプを右の値に適用したい
- 次に、結果をマージして、パイプを続行したいと思います
fork
チュートリアルのように定義します:
問題は、型を正しく作成できないことです。チュートリアルは、内部の (リフトされた) パイプ チェーンを自己完結型のセッションとして実行する方法を示しているだけのようですが、パイプに効果を適用するだけでなく、その値をパイプに再注入できるようにしたいと考えています。もちろん、私はタイプをフォローしようとしましたが、すぐに毛むくじゃらになってしまいます。
誰でもこれについて私を助けることができますか? 前もって感謝します。
(PS: この種のトポロジーの例は、チュートリアルに追加するのに適しています。または、Control.Arrow
パイプを使用してエミュレートする方法に関するセクションがさらに適しています)
haskell - パイプのWriterPを使用して単純なアキュムレータを作成する
パイプライブラリを使用して、あるソースからデータを読み取り、それをモノイド的に蓄積するプログラムを作成したいと思います(たとえば、を使用してSum
)。これを行う最も簡単な方法は、
もちろん、これは小さなソースでは機能しますが、大きな入力は、WriterT
アキュムレータの怠惰な性質のために恐ろしいスタックオーバーフローを引き起こします。
ありがたいことに、これはpipes
これを予期しているようで、WriterP
プロキシに厳密なアキュムレータを提供します。残念ながら、このプロキシを取り巻くドキュメントはかなりまばらです。少し突っ込んだ後(そして問題を単純化して、代わりにダウンストリーム要素ごとに1を累積する)、私はこのプログラムに行きました、
もちろん、このプログラムは、6ではなく1に累積されるため、簡略化されたタスクを正しく実行しません。私が間違っていない場合、この動作は、パイプが終了する前に1つの要素のみを読み取るという事実によって説明されます。入力が終わるまで繰り返すために、私は次のことを思いついた、
ただし、このコードはアキュムレータ0を返します。これはなぜですか?私のような機能はありfold
ますpipes
か?
の多くのユースケースpipes
が大規模なデータセットを処理する長時間実行プロセスであることを考えると、フォールドインを厳密ではなくControl.Proxy.Prelude
厳密に構築することは意味がありませんか?現在、のプロキシトランスフォーマーは二流市民であり、存在しているように感じますが、非常に便利なコンビネータの多くが不足しています。WriterP
WriterT
pipes
WriterT
haskell - ベースモナドでプロキシと異なるEitherTを組み合わせる
たとえば、...
...どうすればこれを機能させることができますか?
注:でミキシングベースモナドを読みましたControl.Proxy.Tutorial
。最初の例を取得しましたが、考案された例を理解できません。より多くの例は、それほど明白ではありませんが、それほど工夫されていないので、ベースモナドの任意の組み合わせの使用方法hoist
と一致方法を明確にする可能性があります。lift
haskell - コンジットのアップストリーム型パラメータの本当の利点は何ですか?
パイプの概念のさまざまな実装の違いを理解しようとしています。コンジットとパイプの違いの 1 つは、パイプを融合する方法です。コンジットは
パイプが持っている間
私が正しく理解している場合、pipesでは、2 つのパイプのいずれかが停止すると、その結果が返され、もう一方が停止します。コンジットでは、左のパイプが終了すると、その結果が下流の右のパイプに送信されます。
私は、conduitのアプローチの利点は何だろうか? コンジットおよびを使用して実装するのは簡単ですが、パイプおよび>+>
を使用して実装するのは(より)難しい例(できれば実世界)を見たいと思います。>->
haskell - コンジットの残り物の利点は何ですか?
コンジットとパイプの違いを理解しようとしています。パイプとは異なり、コンジットには残り物の概念があります。残り物は何に役立ちますか?残り物が不可欠な例をいくつか見てみたいと思います。
そして、パイプには残り物の概念がないので、それらと同様の動作を実現する方法はありますか?
parsing - pipes-attoparsec の「サブパーサー」
Haskell で pipes-attoparsec を使用してバイナリ データを解析しようとしています。パイプ (プロキシ) が関与する理由は、読み取りと解析をインターリーブして、大きなファイルで大量のメモリを使用しないようにするためです。多くのバイナリ形式はブロック (またはチャンク) に基づいており、そのサイズは多くの場合、ファイル内のフィールドによって記述されます。このようなブロックのパーサーが何と呼ばれているかはわかりませんが、タイトルの「サブパーサー」とはそういう意味です。私が抱えている問題は、潜在的に大きなメモリフットプリントなしで簡潔な方法でそれらを実装することです. それぞれが何らかの点で失敗する 2 つの代替案を思いつきました。
代替案 1 は、ブロックを別のバイト文字列に読み込み、それに対して別のパーサーを開始することです。簡潔ではありますが、ブロックが大きいとメモリ使用量が高くなります。
代替案 2 は、同じコンテキストで解析を続け、消費されたバイト数を追跡することです。この追跡はエラーが発生しやすく、最終的な blockParser を構成するすべてのパーサーに感染しているようです。不正な形式の入力ファイルの場合、追跡されたサイズを比較する前に、サイズ フィールドで示されるよりもさらに解析することで時間を浪費することもあります。
haskell - Haskell パイプと分岐
問題
Haskell と Pipes ライブラリを使用して単純な Web サーバーを実装しようとしています。循環トポロジーまたはダイヤモンド トポロジーはパイプでは不可能であることを理解しましたが、私がしようとしているのはそうであると思いました。したがって、私の望ましいトポロジは次のとおりです。
チェーンで使用するタイプがありますHTTPRequest RequestLine Headers Message
。は、ソケットからバイトを受け取り、Attoparsec を使用してバイトをオブジェクトに解析する に転送します。次に、実装する HTTP メソッドの数に応じて、パイプが少なくとも 2 回、場合によってはそれ以上分岐するようにします。各関数は、アップストリームからオブジェクトを受信し、オブジェクトをに転送する必要があります。これにより、HTTPResponse オブジェクトが で送信できるようにまとめられます。HTTPResponse StatusLine Headers Message
socketReadS
parseRequest
HTTPRequest
handle<method>
HTTPRequest
HTTPResponse
packRequest
ByteString
socketWriteS
次のコードは、GHC に型を推論させるかどうかを型チェックrouteRequest'''
します (私のものは少しずれているようです)。ただし、 の後に何も実行されていないようparseRequest
です。誰でも理由を理解するのを手伝ってもらえますか?
コード
routeRequest
分岐を処理する必要がある次のコードがあります。
handleGET
そしてhandlePOST
、そのように実装されています:
プロキシの略記は次のとおりです。
最後に、次のように全体を実行します。
の型シグネチャparseRequestProxy
は次のとおりです。
編集
ソースコードのリポジトリはこちら。加工はしておりませんので、ご利用は自己責任でお願いします。https://bitbucket.org/Dwilson1234/haskell-web-server/overview