haskell - Estado de usuario en Parsec
state (2)
Desafortunadamente, la sugerencia de Yuras de updateParserState
no es óptima (usaría esa función si también está buscando modificar el estado interno de Parsec); en su lugar, debe pasar una función que funcione sobre su estado de usuario personalizado (es decir, de tipo u -> u
) a modifyState
, como en este ejemplo:
expr = do
x <- identifier
modifyState (+1)
-- ^ in this example, our type u is Int
return (Id x)
o use cualquier combinación de las funciones getState
y putState
. Para tu caso, harías algo como:
modifyState (Set.insert v)
Vea este enlace para más información.
Para una introducción más similar a un tutorial sobre cómo trabajar con el estado de usuario en Parsec, este documento , aunque antiguo, debe ser relevante.
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. Desafortunadamente, realmente no entiendo cómo hacerlo.
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 -> ...
Entonces, la u
en la ParsecT suma
serí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 estatal.
Puedes usar updateParserState