問題タブ [iterate]
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 - Iteratee ライブラリを使用して "wc -l" を記述する - 改行をフィルタリングする方法は?
Haskell Iteratee ライブラリを使用して、「wc -l」に相当するものを考え出そうとしています。以下は "wc" のコード (単語をカウントするだけです - ハックの iteratee の例のコードに似ています) で、非常に高速に実行されます:
では、実行速度が速すぎる行の数をカウントするように拡張するにはどうすればよいでしょうか。Prelude.filter を使用して "\n" のみをフィルター処理するバージョンを作成しましたが、メモリが多すぎるため、Linux の "wc -l" と gc (遅延評価だと思います) よりも遅くなります。そのため、Data.ListLike.filter を使用して別のバージョンを作成しましたが、型チェックがないためコンパイルされません。ここで助けていただければ幸いです。
haskell - Iteratee、Enumerator、および Enumeratee という名前に混乱しているのは私だけですか?
私は IO のパラダイムとして iteratees が大好きですが、名前についてはいくつか懸念があります。
これらの名前との関係を築くのに苦労しています。誰かが彼らの起源を説明できますか? どちらかといえば、定義data Stream a = Chunks [a] | EOF
は悪いです。ストリームはストリーム全体のごく一部にすぎないため、これまでのストリームの概念には当てはまりません。
Iteratee
s が物を消費し、Enumerator
s がそれらを生産し、 s が、、およびまたはのようEnumeratee
な名前の両方を行う場合、より良い選択でしょうか? これらの名前が概念にうまく適合しない理由は、慣習とは別に何かありますか?Sink
Source
Transformer
Consumer
Producer
Transformer
このテーマには 117 のバリエーションがありますが、この古い Haskell-Cafe スレッドに対する John Millikin の見解に興味をそそられます。これは、"発散反復" 問題(Continue を返す iteratee の問題)を静的に排除するバリエーションに関するものです。 EOF への応答)、名前に関する私の問題は、私がこれまでに見たほとんどすべてのバージョンに当てはまります。
haskell - 常に再試行する列挙子を作成する方法
私は John Millikin の enumerator パッケージを使用しData.Enumerator.Binary.enumHandle
ており、ソケット自体を接続し、結果のハンドルを列挙しようとすることを除いて、 とほぼ同等のものを作成しようとしています。問題は、接続が信頼できないという事実によるものです。何か問題が発生した場合は、再接続して列挙を再開したいと考えています。
私は通常、Enumerator が独自の意味のある Monad インスタンスであることを期待しますが、関数の型エイリアスであるため、そのモナド動作は入力ステップの単なるリーダーであり、ここではあまり使用されないようです。を使用して Enumerator をループし続ける何かを一緒に投げようとしましたcatchError
が、期待どおりに動作せず、何をしているのか理解できませんでした。 . 明らかに省略した詳細がたくさんあるので、ソリューションの骨組みだけで問題ありません。
何か案は?
haskell - 入力がバッファ サイズより大きい場合、attoparsec-iteratee が機能しない
シンプルな attoparsec ベースのpdf パーサーがあります。iteratee を使用するまでは問題なく動作します。入力のサイズがバッファ サイズを超えた場合。
入力:
したがって、パーサーは iteratee なしで動作し、十分に大きなチャンクで動作しますが、小さなチャンクでは動作しません。iteratee のバグ?attoparsec-iteratee で?私のコードでは?回避策はありますか?私にとって本当に喫緊の課題です。
ありがとう。
haskell - 保護されたパイプは、await を使用するパイプと同じように動作しますか?
パイプは iteratee の本当にエレガントでシンプルなバージョンです。await
プリミティブとを使用して、パイプ コードを非常に簡単に記述できますyield
。Paolo Capriotti は、保護されたパイプtryAwait
を使用してパイプの概念を拡張しました。これは、入力フローがなくなると、パイプが何らかのファイナライズを実行できるようにする、もう少し複雑なプリミティブを使用します。
保護されたパイプの実装は、次await
の点で再定義されますtryAwait
。
私の質問は次のとおりです。単純な Pipes 実装 ( await
andを使用yield
)を対象としたコードを記述した場合、同じコードを使用して、保護されたパイプ実装に切り替えると同じように動作しますか? 言い換えれば、保護されたパイプ コードは、動作の観点から、単にパイプ コードのスーパーセットとして扱うことができますか?
playframework-2.0 - play2の`Iteratee`を理解する方法は?
play.api.libs.iteratee
play2には、Iteratee
1000行を超える大きなオブジェクトを持つパッケージがあります。
なぜplay2はそのような大きなオブジェクトを必要とし、それをどのように理解するのですか?
scala - Play 2.0のIteratee、Enumerator、Enumerateeを理解できません
Play2.0フレームワークを学び始めたところです。私が理解できないことの1つは、プレイチュートリアルで説明されているIteratee、Enumerator、およびEnumerateeのパターンです。関数型言語の経験はほとんどありません。
このパターンは何を達成しますか?
非ブロッキング/リアクティブコードを書くのにどのように役立ちますか?
いくつかの簡単な例が役立ちます。
scala - さまざまな境界に沿って列挙子をチャンクする列挙子を作成する方法
そのため、Play2.0 Enumeratee ページ&>
には、 orthrough
メソッドを使用して を に変更する例が示さEnumerator[String]
れていEnumerator[Int]
ます。
Enumeratee.grouped
個々の要素からチャンクの列挙子を作成する列挙型もあります。それはうまくいったようです。
しかし、私が見ているのは、通常の入力は( andArray[Byte]
によって返される) の形式になるということです。それを念頭に置いて、これらの入力を取得して、たとえば、各文字列が行である(で終わる)に変換したいと思います。通常、線と要素の境界は一致しません。チャンク配列をチャンク文字列に変換できる列挙子を作成するにはどうすればよいですか?Enumerator.fromFile
Enumerator.fromStream
Array[Byte]
Enumerator[String]
'\n'
Array[Byte]
目的は、これらの行が利用可能になるたびにブラウザにチャンクバックしArray[Byte]
、次の入力チャンクが来るまで完全な行の一部ではなかった残りのバイトを保持することです。
理想的には、 aniter: Iteratee[Array[Byte], T]
と anを指定すると、 T 要素が によって解析されたEnumerator[Array[Byte]]
an が返されるメソッドが欲しいです。Enumerator[T]
iter
追加情報: コードをクリーンアップする時間が少しありました。ここに、私がやろうとしていることの具体的な例を示します。次の行を検出する次の反復があります。
そして、私がやりたいことは次のようなものです:
scala - play2 ある Promise を別の Promise に変換する Enumeratee を作成する
Play 2 で Iteratees を使用して彗星の結果をストリーミングする方法をつかもうとしています。コールバックから列挙子を作成し、マップから列挙子を作成するハンドルを取得しました。私の問題は Enumeratee.map にあります。これは、純粋な入力を受け取り、純粋な出力を返す関数を受け取ります (例: docの String から Int への変換)。私がやりたいことは、純粋な入力を取り、結果の約束を返すことです。結局、列挙子は enumeratee に promise を供給し、enumeratee は 1 つの列挙子を別の列挙子に変換するため、promise にマップする enumeratee を作成する方法が必要です。
さて、これをもう少し明確にするために例を挙げましょう。データベースでクエリする ID のリストを含む HTTP リクエストが届いたとします。これらの ID がデータベース テーブルの行を表し、リクエストがこれらの行に対して一連の (長い) 計算を実行し、計算を表す一連の json オブジェクトを返すとします。私は長い間ブロックする必要があるため、一度に 1 つの ID をストリーミングするのはクールなので、次のような enumeratee パイプラインが必要です。
- データベース内の行を照会します (行の promise を返します)
- 行に対して長い計算を行います (行を取り、計算の約束を返します)
- 長い計算を JSON に変換する
- &> これを Play 2 が提供する Comet enumeratee に渡します
1 はちょっと簡単です。クエリ結果の約束を返す fromCallback を使用して列挙子を作成できます。3 も簡単です。単純な Enumeratee.map です。
しかし、ステップ2のenumerateeのapplyOnを実装する方法に頭を悩ませることはできません。「内側の」イテラティーからプロミスを取得し、長い計算をflatMapして返す新しいイテラティーを構築する必要があることを理解できます。新しい約束。私が得られないのは、奇妙なapplyOn署名を考慮してこれを作成する方法です:def applyOn[A](it: Iteratee[To, A]): Iteratee[From, Iteratee[To, A]]
誰かがそれを手伝ってくれますか?
ありがとう
scala - Scala: Enumerator[T] の一部のデータを読み取り、残りの Enumerator[T] を返す
Iteratees と Enumerator を使用する playframework の非同期 I/O ライブラリを使用しています。これで、データ シンクとして Iterator[T] が作成されました (簡単にするために、内容をファイルに格納する Iterator[Byte] とします)。この Iterator[Byte] は、書き込みを処理する関数に渡されます。
しかし、書き込みの前に、ファイルの先頭にいくつかの統計情報を追加したいので (簡単にするために 1 バイトとします)、書き込み関数に渡す前に次の方法でイテレータを転送します。
保存されたファイルをディスクから読み取ると、そのファイルの Enumerator[Byte] が取得されます。最初に、追加のデータを読み取って削除し、残りの Enumerator[Byte] を読み取りを処理する関数に渡したいと考えています。したがって、列挙子も変換する必要があります。
しかし、これを行う方法がわかりません。Enumerator からいくつかのバイトを読み取り、残りの Enumerator を取得するにはどうすればよいですか?
Iteratee[Byte] を OutputStream に、Enumerator[Byte] を InputStream に置き換えると、これは非常に簡単になります。
しかし、play フレームワークの非同期 I/O が必要です。