問題タブ [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 - パイプの終わりを見つける方法
以下のコードでは、どうすればよいですか
stdoutCharConsumer
入力ストリームからのすべてのデータを出力した後に改行を出力するように変更します実装
mixin
し、mixin'
Pipes.Internalに入らずに?出来ますか?next
Producersの関数のようなものが必要です。
Pipes 4.1.0を使用しています
UPD:プル/プッシュ ベースのストリームについて読んだ後、Pipes.Internal でも不可能だと思います。本当ですか?
exception - パイプを終了せずにパイプで例外をキャッチする
これはちょっと遠回りのように感じますが、データベースに接続し、サーバー上のデータベースのリストを取得し、それぞれに接続し、それぞれに対してクエリを実行し (ユーザー数)、それらを出力するためのパイプを作成しました。数えます。残念ながら、これは私の実際の例から単純化できる程度のものです。pipes-4.1.0、pipes-safe-2.0.2、および mysql-simple-0.2.2.4 を使用しています。コードは次のとおりです。
これはうまくいきます。ただし、これらのデータベースの 1 つで、user テーブルの名前が user ではなく users であるとしましょう。したがって、mysql-simple はそのクエリの実行時に例外をスローします。そのエラーをインラインでキャッチし、それらのクエリに対して 0 ユーザーを返すだけで、続行します。私が試したこと:
これはうまくいきません。場合によっては、失敗を出力して 0 を生成し、例外ですぐに終了することがあります。おそらく例外で queryProducer から抜け出したためだと思いました。再度呼び出す必要があるため、この再帰バージョンを試しました。
しかし、これも失敗します。ただし、実際にはいくつかのクエリを実行し、失敗を数回出力して、再び例外で終了する前にいくつかの 0 を生成することがあります。なぜこれが起こっているのか、私は本当に混乱しています。
非同期ライブラリによると、パイプが実行されているスレッドに例外を送信する必要があるため、スレッドの問題である可能性はないようです。
私の queryProducer の実装が重要な場合、これは pipes-postgresql クエリ関数の後にモデル化され、Producer に一般化されているため、他のコンビネータに埋め込むことができます。mysql-simple の下の mysql ライブラリには、SQL が意味をなさない場合に ConnectionError をスローする throw があり、この関数全体に浸透します。
また、EitherT を使用して例外をキャッチしようとしました。これは、過去にパイプで行われた方法と思われるためです。しかし、パイプのチュートリアルのドキュメントは 3 から 4 の間に消えてしまい、そのテクニックがまだ推奨されているかどうか疑問に思っています。残念ながら、単数形の await/yields の代わりに queryProducer を使用している方法では、構造化する方法がわからないため、機能させることができませんでした。
haskell - パイプ ライブラリのコンテキストでのストリーミングと効果の明確化
パイプのチュートリアルでは、ドキュメントでこれについて言及しています。
Effects を犠牲にすると、Haskell の純粋で遅延したリストが得られます。これは、コンポーズ可能な関数を使用して定数空間で変換できますが、効果をインターリーブする必要はありません。
ストリーミングを犠牲にすると、構成可能で効果的な mapM、formM、および "ListT done wrong" が得られますが、リスト全体が最初に処理されてメモリにロードされるまで、単一の結果は返されません。
Streaming
しかし、インターレーブ効果を意味しませんか? のときはStreaming
、実際にチャンクごとに消費します。それで、チャンクごとに消費している間、効果はインターリーブされませんか?
json - Pipes.Aeson を使用した Haskell での JSON のストリーミング解析
Pipes.Aeson ライブラリは、次の関数を公開します。
このパーサーとファイル ハンドルを引数として evalStateT を使用すると、1 つの JSON オブジェクトがファイルから読み取られて解析されます。
問題は、ファイルに複数のオブジェクト (すべて同じタイプ) が含まれており、それらを読み取るときに折りたたむか縮小したいことです。
Pipes.Parse は以下を提供します。
しかし、ご覧のとおり、これは新しいパーサーを返します。最初のパーサーを引数として指定する方法が思い浮かびません。
パーサーは実際には StateT モナド変換子のプロデューサーのようです。StateT からプロデューサーを抽出して、evalStateT を foldAll パーサーに適用し、プロデューサーをデコード パーサーから抽出する方法はないかと考えました。
ただし、これはおそらく完全に間違ったアプローチです。
簡単に言えば、私の質問:
Pipes.Aeson を使用してファイルを解析する場合、ファイル内のすべてのオブジェクトを折りたたむ最良の方法は何ですか?
haskell - Haskell で Producer/Parser を折りたたむとスペースが爆発する
次のようなモジュールがあるとします。
「produceString」関数はバイト文字列プロデューサーであり、解析を折りたたんで何らかの結果を生成することに関心があります。
次の 2 つのプログラムは、バイト文字列を一連の JSON int として解析することにより、バイト文字列の最大値を見つけるという問題に取り組むさまざまな方法を示しています。
プログラム 1:
プログラム 2:
残念なことに、両方のプログラムをプロファイリングすると、合計で約 200MB のメモリを消費します。この問題は、ストリーミング パーサーを使用することで解決できると期待していました。最初のプログラムは、ほとんどの時間とメモリ (> 70%) をLens.Family(^.)
から使用します。使用グラフは以下。どちらのプログラムも、時間の約 70% をガベージ コレクションに費やしています。fmap
zoom
私は何か間違ったことをしていますか?Prelude 関数max
は十分に厳密ではありませんか? ライブラリ関数が悪いのか、それともライブラリの使い方が間違っているのかわかりません! (多分後者です。)
完全を期すために、私が話していることを直接確認したい場合は、複製して実行できるgit リポジトリを次に示します。2 つのプログラムのメモリ使用量は次のとおりです。cabal install
haskell - Pipes.Safe - mapM の使い方
2 番目のパイプ ( ) がなくても問題ないパイプを使用した次のコードがあります>-> P.mapM ( fillMD5)
。fillMD5
は操作a -> IO a
です。
エラーは次のとおりです。
のタイプmapM
が
Safe.SafeT
しかし、これを?に持ち上げる方法がわかりません。