私はParsecを使用して式を解析しています。これらの式の変数をParsecのユーザー状態を使用して追跡したいと思います。残念ながら、私は本当にそれを行う方法を取得していません。Parsecのユーザー状態
import Data.Set as Set
inp = "$x = $y + $z"
data Var = V String
var = do char '$'
n <- many1 letter
let v = Var n
-- I want to modify the set of variables here
return v
parseAssignment = ... -- parses the above assignment
run = case runIdentity $ runParserT parseAssignment Set.empty "" inp of
Left err -> ...
Right -> ...
ので、ParsecT s u m a
でu
はSet.Set
次のようになります。
は、次のコードを考えます。しかし、私はどのようにvar
に状態の更新を統合するのですか?
私はmodify $ Set.insert v
のようなものを試しましたが、Set.Set
は状態のモナドではないため、これは機能しません。
ありがとう!それはまさに私が必要とするものです。以前はその関数を見ていた可能性があります...私は何とかmodifyStateがControl.Monad.Stateからの変更に関連していると考えました。 – bzn
@bzn:でもそれは関連しています!あなたがParsecをユーザー状態だけを保持する状態のモナドと考えるならば、同じことをします。 'modifyState'がParsecの内部状態を無視するためにのみ違いがあります。 –