Attoparsec是否支持保存和修改用户状态?

时间:2015-05-28 11:27:40

标签: haskell attoparsec

我正在使用Attoparsec,我想在整个解析任务中跟踪用户状态值。

我熟悉Parsec的monadic函数getState,putState和modifyState,但我似乎无法在Attoparsec中找到一个类似物。使用Attoparsec内部的东西或使用状态monad是否有一种简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:5)

您可以使用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组合器,因为它们具有AlternativeMonadPlusApplicative或{{1}的通用类型约束,Monad定义了这些的提升实例。我们可以将StateT用于基本lift - s。