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