gpt4 book ai didi

haskell - Parsec 中的用户状态

转载 作者:行者123 更新时间:2023-12-03 14:52:37 25 4
gpt4 key购买 nike

我正在使用 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 -> ...

所以, uParsecT s u m a将是 Set.Set .但是我如何将状态更新集成到 var ?

我试过类似 modify $ Set.insert v ,但这不起作用,因为 Set.Set不是状态单子(monad)。

最佳答案

不幸的是,Yuras 对 updateParserState 的建议不是最优的(如果你也想修改 Parsec 的内部状态,你会使用那个函数);相反,您应该将一个适用于您的自定义用户状态(即类型 u -> u )的函数传递给 modifyState ,例如在此示例中:

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

或使用 getState 的任意组合和 putState功能。对于您的情况,您可以执行以下操作:
modifyState (Set.insert v)

this link了解更多信息。

有关在 Parsec 中使用用户状态的更多类似教程的介绍, this document ,虽然旧,但应该是相关的。

关于haskell - Parsec 中的用户状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com