gpt4 book ai didi

haskell - Attoparsec 支持保存和修改用户状态吗?

转载 作者:行者123 更新时间:2023-12-02 17:35:47 27 4
gpt4 key购买 nike

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

我熟悉 Parsec 的一元函数 getState、putState 和修改状态,但我似乎无法在 Attoparsec 中找到类似的函数。有没有一种简单的方法可以通过 Attoparsec 内部的东西或使用 State monad 来做到这一点?

最佳答案

您可以使用 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 组合器,因为它们具有带有 AlternativeMonadPlusApplicativeMonad 约束,而 StateT 为这些定义了直通实例。我们可以使用 lift 作为基本的 Parser-s。

关于haskell - Attoparsec 支持保存和修改用户状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30505255/

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