Me sorprende que no pude encontrar ninguna información sobre esto. Debo ser la única persona que tenga problemas con eso.Cómo usar Control.Monad.State con Parsec?
Entonces, digamos que tengo un contador de puntos. Quiero que cuente el número de guiones en la cadena y devuelva la cadena. Imagina que di un ejemplo que no funcionará con el manejo del estado de parsec. Así que esto debería funcionar:
dashCounter = do
str <- many1 dash
count <- get
return (count,str)
dash = do
char '-'
modify (+1)
Y de hecho, esto compila. De acuerdo, entonces trato de usarlo:
:t parse dashCounter "" "----"
parse dashCounter "" "----"
:: (Control.Monad.State.Class.MonadState
t Data.Functor.Identity.Identity,
Num t) =>
Either ParseError (t, [Char])
Bien, eso tiene sentido. Debería devolver el estado y la cadena. Guay.
>parse dashCounter "" "----"
<interactive>:1:7:
No instance for (Control.Monad.State.Class.MonadState
t0 Data.Functor.Identity.Identity)
arising from a use of `dashCounter'
Possible fix:
add an instance declaration for
(Control.Monad.State.Class.MonadState
t0 Data.Functor.Identity.Identity)
In the first argument of `parse', namely `dashCounter'
In the expression: parse dashCounter "" "----"
In an equation for `it': it = parse dashCounter "" "----"
Oops. Pero, ¿cómo podría haber esperado alguna vez trabajar en primer lugar? No hay forma de ingresar el estado inicial.
Existe también una función:
>runPT dashCounter (0::Int) "" "----"
pero da un error similar.
<interactive>:1:7:
No instance for (Control.Monad.State.Class.MonadState Int m0)
arising from a use of `dashCounter'
Possible fix:
add an instance declaration for
(Control.Monad.State.Class.MonadState Int m0)
In the first argument of `runPT', namely `dashCounter'
In the expression: runPT dashCounter (0 :: Int) "" "----"
In an equation for `it':
it = runPT dashCounter (0 :: Int) "" "----"
me siento como que debería tener que runState en él, o no debería ser una función que ya lo hace internamente, pero me parece que no puede averiguar dónde ir desde aquí.
Editar: Debería haber especificado más claramente, no quería usar el manejo de estado de parsec. La razón es que tengo la sensación de que no quiero que su retroceso afecte lo que se acumula con el problema con el que me estoy preparando para resolverlo.
Sin embargo, el Sr. McCann ha descubierto cómo esta debe encajar juntos y el código final sería el siguiente:
dashCounter = do
str <- many1 dash
count <- get
return (count,str)
dash = do
c <- char '-'
modify (+1)
return c
test = runState (runPT dashCounter() "" "----------") 0
muchas gracias.
Eche un vistazo a esto: http://stackoverflow.com/questions/6477541/user-state-in-parsec – bzn