私は Attoparsec を使用しており、解析タスク全体でユーザー状態値を追跡したいと考えています。
私は Parsec のモナド関数 getState、putState、および modifyState に精通していますが、Attoparsec 内で類似物を見つけることができないようです。Attoparsec の内部で、または State モナドを使用してこれを行う簡単な方法はありますか?
私は Attoparsec を使用しており、解析タスク全体でユーザー状態値を追跡したいと考えています。
私は Parsec のモナド関数 getState、putState、および modifyState に精通していますが、Attoparsec 内で類似物を見つけることができないようです。Attoparsec の内部で、または State モナドを使用してこれを行う簡単な方法はありますか?
を使用できますが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
ジェネリック型があり、これらのリフトスルー インスタンスが定義されているからです。基本的な-sに使用できます。Alternative
MonadPlus
Applicative
Monad
StateT
lift
Parser