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 a会Set.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)
或使用getState和putState功能的任意组合.对于您的情况,您可以执行以下操作:
modifyState (Set.insert v)
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此链接.
有关在Parsec中使用用户状态的更多教程介绍,本文档虽然陈旧,但应该是相关的.
| 归档时间: |
|
| 查看次数: |
2989 次 |
| 最近记录: |