11

ParsecHaskellにリアクティブ(または他の純粋な関数型パーサー)はありますか(または持つことは可能ですか)?

簡単に言えば、パーサーにcharごとにフィードして、出力を取得するのに十分な量の結果を取得したいと考えています。

または、もっと簡単に、どうすればそれを実行できますfoldrmap

そのような反応的な振る舞いをサポートするために、それらの異なるバージョンが必要ですか?

編集

私の質問は特にFRPについてです。例としてパーサーを使用しました。これは、質問を明確にし、必要なものの全体像を示すために考えられる最善の方法でした。

FRPはUIだけではないと思いますよね?

4

4 に答える 4

8

これを「FRP」と呼ぶのは適切ではないと思います。この種のものの正しい名前はオンライン アルゴリズム です。これは、パーサーが入力を受け取るとすぐに出力を生成することを意味します。(パーサーが入力全体を前もって受け取り、そこから出力を生成するオフライン アルゴリズムとは対照的です。)

Haskell では、遅延評価によりオンライン アルゴリズムを簡単に記述できます。Malcom Wallace は、遅延評価を使用するオンライン解析用のパーサー コンビネータの特別なセットを開発しました。

于 2011-07-14T07:22:11.237 に答える
8

Parsec でオンライン解析を行うことはできません。有効な解析があるかどうかを判断するために、すべての入力を消費する必要があります。

ただし、代替手段があります。1 つの可能性は、ユトレヒト パーサー コンビネーターを使用することです。これには、その機能の中にオンライン解析があります。

于 2011-07-13T12:54:18.710 に答える
6

Parsec でオンライン解析を実行できますが、そうするには iteratee のようなものの上にそれを重ねる必要があります。

Parsec 3 は任意の Stream タイプを扱うことができるため、現在の「ストリーム」を位置として表示する Stream のインスタンスを作成し、反復子を使用してその位置の値を取得できます。

そのような例の 1 つがiteratee-parsec パッケージです。

iteratees と parsec で trifecta talk を解析する別のアプローチが提供されます(警告 PDF):

妥協点は、すべてではなく最後のいくつかのチャンク フラグメントをバッファリングする iteratee のような型を構築して、制限されたスペース使用率を維持できるようにし、それ以上のバックトラックを iteratee 機構に依存することです。これは私が現在使用しているものですが、オンラインのコードはありません。

Parsec を Iteratee の上で実行して制御を反転させたら、一度に 1 文字ずつ入力して、まだ何かを認識できているかどうかを確認するのは非常に簡単です。

于 2011-07-15T06:35:23.000 に答える
1

attoparsec-conduit を見てください。正しいパーサーを使用すると、バイト ストリームを解析済みデータ構造のストリームに変換する便利な方法になります。

于 2012-09-07T14:20:19.453 に答える