首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Attoparsec是否支持保存和修改用户状态?

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

Stack Overflow用户
提问于 2015-05-28 11:27:40
回答 1查看 414关注 0票数 6

我正在使用Attoparsec,我希望在解析任务的整个过程中跟踪用户状态值。

我熟悉Parsec的一元函数getState、putState和modifyState,但在Attoparsec中似乎找不到类似的东西。对于Attoparsec内部的某件事,还是使用一个国家的单一程序,是否有一种琐碎的方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-28 13:56:40

您可以使用StateT s Parser,只需注意解析器中的回溯也会回滚状态,因此您只能获得那些在代码路径上成功解析时调用的有状态操作。

代码语言:javascript
复制
{-# 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组合器,因为它们具有带有AlternativeMonadPlusApplicativeMonad约束的泛型类型,而StateT为这些约束定义了可提升的实例。我们可以将lift用于基本的Parser-s。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30505255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档