6

私は Attoparsec を使用しており、解析タスク全体でユーザー状態値を追跡したいと考えています。

私は Parsec のモナド関数 getState、putState、および modifyState に精通していますが、Attoparsec 内で類似物を見つけることができないようです。Attoparsec の内部で、または State モナドを使用してこれを行う簡単な方法はありますか?

4

1 に答える 1

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ジェネリック型があり、これらのリフトスルー インスタンスが定義されているからです。基本的な-sに使用できます。AlternativeMonadPlusApplicativeMonadStateTliftParser

于 2015-05-28T13:56:40.730 に答える