Przetwarzam wyrażenie za pomocą Parsec i chcę śledzić zmienne w tych wyrażeniach przy użyciu stanu użytkownika w Parsec. Niestety tak naprawdę nie wiem, jak to zrobić.Stan użytkownika w Parsec
Biorąc pod uwagę następujący kod:
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 -> ...
Tak, u
w ParsecT s u m a
byłby Set.Set
. Ale jak mogę zintegrować aktualizację stanu do var
?
Próbowałem czegoś takiego jak modify $ Set.insert v
, ale to nie działa, ponieważ Set.Set
nie jest monadą państwową.
Dzięki! To jest dokładnie to, czego potrzebuję - mogłem wcześniej przyjrzeć się tej funkcji ... jakoś myślałem, że modifiedState było związane z modyfikacją z Control.Monad.State. – bzn
@bzn: Jest to jednak powiązane! Jeśli uważasz Parsec za stanową monadę trzymającą tylko stan użytkownika, robią to samo. Różnią się tylko dlatego, że 'modifyState' ignoruje wewnętrzny stan Parsec. –