我正在使用Attoparsec,我希望在解析任务的整个过程中跟踪用户状态值。
我熟悉Parsec的一元函数getState、putState和modifyState,但在Attoparsec中似乎找不到类似的东西。对于Attoparsec内部的某件事,还是使用一个国家的单一程序,是否有一种琐碎的方法来做到这一点?
发布于 2015-05-28 13:56:40
您可以使用StateT s Parser,只需注意解析器中的回溯也会回滚状态,因此您只能获得那些在代码路径上成功解析时调用的有状态操作。
{-# LANGUAGE OverloadedStrings #-}
import Data.Attoparsec.ByteString.Char8
import Control.Monad.State
import Control.Applicative
test :: StateT Int Parser ()
test = do
many $ choice [
(modify (+1) *> lift (string "car")),
(modify (+1) *> lift (string "cat"))]
pure ()
parseOnly (runStateT test 0) "catcatcat"
-- Right ((),3)另外,我们可以开箱即用大多数Attoparsec组合器,因为它们具有带有Alternative、MonadPlus、Applicative或Monad约束的泛型类型,而StateT为这些约束定义了可提升的实例。我们可以将lift用于基本的Parser-s。
https://stackoverflow.com/questions/30505255
复制相似问题