Estoy analizando una expresión usando Parsec y quiero hacer un seguimiento de las variables en estas expresiones usando el estado del usuario en Parsec. Lamentablemente, realmente no entiendo cómo hacerlo.Estado del usuario en Parsec
Dado el siguiente código:
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 -> ...
Así, el u
en ParsecT s u m a
habría Set.Set
. ¿Pero cómo integraría la actualización de estado en var
?
Intenté algo como modify $ Set.insert v
, pero esto no funciona, ya que Set.Set
no es una mónada de estado.
Gracias! Eso es exactamente lo que necesito, podría haber mirado esa función antes ... de alguna manera pensé que modifyState estaba relacionado para modificar desde Control.Monad.State. – bzn
@bzn: ¡Está relacionado, sin embargo! Si piensas en Parsec como una mónada de estado que solo tiene el estado de usuario, hacen lo mismo. Se diferencian solo porque 'modifyState' ignora el estado interno de Parsec. –