1

パーサーコンビネーターを書いているときgetに、put関数を使用できるようにしたいと思います。State Monaduu-parsinglib

これはどのように行うことができますか?このライブラリを使用して状態パーサーを作成できますか?

4

1 に答える 1

3

Sjoerd のコメントは正しい。uu-parsinglib の基本的な解析記述子の型は ですP st a。ここで、st は入力/解析状態を維持する型であり、a は出力型です。これは Text.ParserCombinators.UU.Core で定義されています。

UU.Core の基本的なコンビネータのいくつかは、st の可能性にいくつかの制約を課します。つまり、UU.Core で定義されているEofStoresErrors、およびHasPositionクラスのインスタンスを持たなければならないということです。すべての機能を使用するには、他のインスタンスが必要になる場合があります。

Text.ParserCombinators.UU.BasicInstances パッケージは、Char を含み、エラーと位置の状態を提供する ListLike クラスのストリームを介してパーサーを作成できる、これらすべての適切なインスタンスを提供します。

位置とエラー状態を持つ Char の ListLike コンテナー以外のものに対してパーサーを作成する場合、たとえば、トークン タイプに基づいて解析したり、任意のユーザー提供の状態を格納したりする場合は、Text.ParserCombinators に似たモジュールを作成する必要があります。 .UU.BasicInstances では、解析ライブラリのニーズと共にニーズを満たす独自のインスタンスを提供します。

あなたの要求については、MonadState インターフェイスを実装するために必要なフィールドをStr a s loc使用してデータ型 ( のst型に使用される) を拡張し、(UU.BasicInstances に既にあるインスタンスに加えて) のインスタンスを提供する必要があると思います。拡張された Str 型を使用して および を提供します。UU.Core はすでに の Monad インスタンスを提供しているため、MonadState インスタンスを特定の状態タイプに制限する場合、これはそれほど難しくありません。P st aMonadState (P <your new type> a)getsetP st a

于 2013-08-13T23:23:48.150 に答える