問題タブ [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の紹介または簡単な例?
Iterateeに関するOlegのドキュメントを理解するのは少し難しいと思います。特に、Haskell-Cafeへの彼の投稿にある関数のいくつかは(のようにenum_file
)iterateeライブラリにないので。
iterateeの良い入門書はどこかにありますか?ファイル/ソケットを開く、データを読み取って処理するなどの基本を学びます。
haskell - この列挙者を仕上げるのに問題があります
ある時点で、私はhaskellでパケットキャプチャプログラムを作成し、レイジーIOを使用してすべてのtcpパケットをキャッチしました。問題は、パケットが故障していることがあるため、finフラグを取得するまで、すべてのパケットをリストに挿入して、パケットを処理するために必要なすべてのパケットがあることを確認する必要がありました。ビデオのように本当に大きいので、私はそれらすべてをメモリに保持しなければなりませんでした。他の方法でそれを行うには、いくつかの難しい命令型コードが必要になります。
それで後で私は反復について学びました、そして私は自分自身を実装することに決めました。それがどのように機能するかというと、列挙者がいます。保持したいパケット数を指定します。パケットをプルすると、それらをソートし、指定した数に達するとフラッシュを開始しますが、そこにいくつかを残して、新しいチャンクがそのリストにソートされてから、さらにパケットがフラッシュされるようにします。アイデアは、チャンクがこの列挙子に到達する前にほぼ順番になり、ほとんどの小さな順序の問題を修正するというものです。EOFを取得すると、残りのすべてのパケットを送り返す必要があります。
だからそれはほとんど動作します。これらのいくつかは標準の列挙関数に置き換えることができると思いますが、それがどのように機能するかを理解するために自分で書きたかったのです。ここにいくつかのコードがあります:
Readlinesは、ファイルから一度に1行ずつ行を取得し、それをフィードします。PrintLinesは、各チャンクを印刷するだけです。numbers.txtは、行で区切られた数字のセットで、順序が少しずれています。一部の数字は、本来あるべき前後にいくつかのスペースがあります。Reorderは、n個の数値を保持し、新しい数値をアキュムレータリストに並べ替えてから、それらの数値の最後のn個を除くすべてを押し出す関数です。
私の問題は、並べ替えの未定義にあります。何が起こるかというと、リオーダーには10個のアイテムがスタックしていて、スタックの上位からEOFを受け取ります。したがって、k(チャンクそれらの10アイテム)になり、それを機能させるためにここに何を置くべきかわからないため、未定義があります。
何が起こるかというと、最後の10項目がプログラムの出力から切り取られます。トレースを見ると、その変数bufには残りのすべてのアイテムが含まれています。私は譲歩を試みましたが、何を譲るのか、あるいは譲るべきかどうかがわかりません。この機能を実現するために何を配置すればよいかわかりません。
編集:ループの未定義部分を次のように変更することで、並べ替えが修正されたことがわかります。
ある時点でほぼ間違いなく持っていたのですが、正しい答えが得られなかったので、間違っていると思いました。
問題はprintLinesにありました。リオーダーは最後までチャンクを1つずつ送信していたので、ループごとに最初のチャンク以外のチャンクを破棄するというprintLinesの問題に気付くことはありませんでした。私の頭の中で、私はチャンクが持ち越されるか何かを考えました、それは愚かでした。
とにかく私はprintLinesをこれに変更しました:
そして今、それは機能します。どうもありがとうございました、私は答えが得られないのではないかと心配していました。
haskell - iterateeライブラリの最新バージョン(執筆時点では0.8.1.2)をどのように使用しますか?
iterateeとenumeratorの概念に関するチュートリアルを読み、それらがどのように機能するかを学習する方法としてサンプルバージョンを実装しました。ただし、iterateeパッケージで使用されるタイプは、私が見つけたどのチュートリアルとも大きく異なります。たとえば、Iteratee
は次のように定義されます。
私はそれで何をするつもりなのか本当に理解していません。このバージョンの使用に関するチュートリアルはありますか、また、なぜこのように書かれたのか(つまり、Olegが行った元の方法に比べてどのような利点があるのか)。
haskell - フィルタリング/分岐列挙
enumerator-0.4.10を使用しており、着信ストリームのさまざまな部分の処理をさまざまな反復に分散する必要があります(巨大なXMLファイルを解析しており、サブツリーごとに処理ロジックが異なります)。サブツリーは交差しないため、一度にアクティブになるのは1つの反復子のみです。
ストリームをフィルタリングし、結果を1つの反復子に渡す簡単な例を作成しました。下記を参照してください。ただし、ネストされた反復が複数あると、列挙子を使用できなくなったように見えます。複数の内部反復を保持する独自の複数列挙子を作成する必要がありますか?より良いアイデアはありますか?
ネストされた単一の反復子の(初心者の)コードは次のとおりです。
haskell - Attoparsec Iteratee
Iteratees について少し学ぶために、Data.Iteratee と Data.Attoparsec.Iteratee を使用して、私が作成した単純なパーサーを再実装したかったのです。私はかなり困惑しています。以下に、ファイルから1行を解析できる簡単な例を示します。私のパーサーは一度に 1 行ずつ読み取るため、それが完了するまで iteratee に行を供給する方法が必要です。これをグーグルで見つけたものはすべて読みましたが、反復子/列挙子に関する多くの資料はかなり高度です。これは重要なコードの部分です。
この例では、複数行のファイルから 1 行を解析して出力します。元のスクリプトは、パーサーを ByteStrings のリストにマッピングしていました。ですから、ここでも同じことをしたいと思います。私enumLines
は Iteratee で見つけましたが、一生それを使用する方法を理解することはできません。多分私はその目的を誤解していますか?
haskell - Haskell iteratee: 末尾の空白を削除する簡単な作業例
Haskell で iteratee ライブラリを使用する方法を理解しようとしています。これまでに目にしたすべての記事は、どのように iteratee を構築できるかについての直感を構築することに焦点を当てているように見えます。iteratees のソース コードを見ることは、私にとってあまり価値がありませんでした。
行から末尾の空白を削除するこの関数があるとしましょう:
私がやりたいことは、これを iteratee にし、ファイルを読み込んで、各行から末尾の空白を取り除いて別の場所に書き出すことです。iteratees を使用してそれを構造化するにはどうすればよいですか? Data.Iteratee.Char に関数があり、これに組み込むことができますが、上記の関数を使用する必要があるかどうか、または上記の関数を iteratee に再パッケージ化する方法がenumLinesBS
わかりません。mapChunks
convStream
haskell - ネストされた反復
私は特定のデータベースを使用しています。クエリが成功すると、特定のコマンドを使用して、結果のデータのチャンクのグループにアクセスできます。
getResultDataは、応答コードと、応答コードが次のようになっているデータを返します。
ByteStringは、チャンクの1つ、一部、またはすべてです。
データhttp://desmond.imageshack.us/Himg189/scaled.php?server=189&filename=chunksjpeg.png&res=medium
話はここで終わりではありません。グループのストリームが存在します:
getResultDataからNO_MORE_DATA応答を受信すると、getNextItemを呼び出すとストリームが繰り返され、getResultDataの呼び出しを再開できるようになります。getNextItemがSTREAM_FINISHEDを返すと、彼女が書いたのはそれだけです。私は自分のデータを持っています。
ここで、この現象をDate.IterateeまたはData.Enumeratorのいずれかで改造したいと思います。私の既存のData.Iterateeソリューションは機能しますが、それでも非常に単純なように見えます。現在のソリューションの実装方法である1つの大きなiterateeブロブではなく、ネストされた反復でこれをモデル化する必要があるように感じます。
私はData.Iteratee0.8.6.2のコードを見てきましたが、ネストされたものに関しては少し混乱しています。
ネストされたものは適切な行動方針を繰り返しますか?もしそうなら、ネストされた反復でこれをどのようにモデル化するでしょうか?
よろしく
haskell - http-enumerator の「http」が Iteratee であるのはなぜですか?
の型シグネチャhttp
は次のとおりです。
代わりになぜこれではないのですか?
私の理解が正しければ、 anIteratee x m a
は type のアイテムのストリームを消費するモナド パーサーのようなものですx
。http
のコールバックIteratee
は、応答本文を消費するため、 であることが理にかなっています。
ただし、http
それ自体は入力を消費していないようです。httpLbs関数は (Data.Enumerator で定義) で実行さhttp
れrun_
ます。私が言えることから、run
与えられた iteratee が入力を期待している場合、それはエラーと見なされます。
http
では、入力を消費しないのであれば、なぜ iteratee なのですか? なぜそれはただのMonadIO
行動ではないのですか?
haskell - 2 つの列挙型の結合
私はenumerator
ライブラリに頭を悩ませようとしていますが、既存の2つの列挙型に関して新しい列挙型を構築したい状況に遭遇しました。私が列挙型を持っているとしましょう:
それらを組み合わせて1つの列挙型にできるはずだと感じています
しかし、パッケージでこれを行う既存の関数が見つかりませんでした。私はそのような関数を自分で作成しようとしましたが、反復の理解はまだ非常に限られているため、すべての複雑な型を一致させる方法を見つけることができませんでした.
基本的なコンビネータを見逃したのですか、それとも列挙型は互いに構成可能であるはずですか?
haskell - Enumerator が入力を消費しようとするとどうなりますか?
の定義Enumerator
は次のとおりです。
ドキュメントには、s がデータを消費している間Iteratee
、s がデータをEnumerator
生成すると記載されています。このようなタイプのデータを生成する方法を理解できます。
(はこれよりも複雑です...が与えられた後に がそうでないenumEOF
ことを確認し、そうである場合はエラーをスローするようです。)Iteratee
Continue
EOF
つまり、で実行すると、 がIteratee
生成されます。これは列挙子に供給され、続行できるように列挙子に供給されます。私の列挙子は結果の継続を返します。Step
runIteratee
Step
Stream
Iteratee
1 つ気になる点があります。このコードはモナドで実行されています。つまり、データを消費できるということですよね?
ドキュメントには、列挙子がソースとシンクの両方として機能する場合は、Enumeratee
代わりに使用する必要があると記載されています。
しかし、明らかにそうする必要はありませんでした。Enumerator
関数で示されているように、 の定義で入力を使用できenumStreamWeird
ます。
私の質問は次のとおりです。
Enumerator
のように 内でデータを「消費」しようとするとどうなりますenumStreamWeird
か? データはどこから来たのですか?列挙子でデータを消費するほど狂っていなくても、生成しているデータを読み取る iteratee に代わってではなく、列挙子に代わって基礎となるモナドでアクションを実行することは有効ですか?
後者の質問は私の主な質問とはあまり関係がないかもしれませんが、 anEnumerator
がどのように機能するかを理解しようとしています。