Parsec中的用户状态

bzn*_*bzn 16 state haskell parsec

我正在使用Parsec解析表达式,我想使用Parsec中的用户状态跟踪这些表达式中的变量.不幸的是我真的没办法怎么做.

给出以下代码:

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 -> ...
Run Code Online (Sandbox Code Playgroud)

所以,uin ParsecT s u m aSet.Set.但是我如何将状态更新集成到var

我尝试了类似的东西modify $ Set.insert v,但是这不起作用,因为Set.Set它不是状态monad.

Rae*_*eez 17

不幸的是,Yuras的建议updateParserState并不是最优的(如果你想要修改Parsec的内部状态,你也可以使用该函数); 相反,你应该传递一个适用于你的自定义用户状态(即类型u -> u)的函数modifyState,例如在这个例子中:

expr  = do
  x <- identifier
  modifyState (+1)
  -- ^ in this example, our type u is Int
  return (Id x)
Run Code Online (Sandbox Code Playgroud)

或使用getStateputState功能的任意组合.对于您的情况,您可以执行以下操作:

modifyState (Set.insert v)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此链接.

有关在Parsec中使用用户状态的更多教程介绍,本文档虽然陈旧,但应该是相关的.