我正在使用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是一個只保存用戶狀態的狀態monad,他們也會做同樣的事情。它們的區別僅在於「modifyState」忽略了Parsec的內部狀態。 –