パーサーコンビネーターを書いているときget
に、put
関数を使用できるようにしたいと思います。State Monad
uu-parsinglib
これはどのように行うことができますか?このライブラリを使用して状態パーサーを作成できますか?
パーサーコンビネーターを書いているときget
に、put
関数を使用できるようにしたいと思います。State Monad
uu-parsinglib
これはどのように行うことができますか?このライブラリを使用して状態パーサーを作成できますか?
Sjoerd のコメントは正しい。uu-parsinglib の基本的な解析記述子の型は ですP st a
。ここで、st は入力/解析状態を維持する型であり、a は出力型です。これは Text.ParserCombinators.UU.Core で定義されています。
UU.Core の基本的なコンビネータのいくつかは、st の可能性にいくつかの制約を課します。つまり、UU.Core で定義されているEof
、StoresErrors
、および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 a
MonadState (P <your new type> a)
get
set
P st a