Rob*_*ani 6 haskell attoparsec
我正在使用Attoparsec,我想在整个解析任务中跟踪用户状态值.
我熟悉Parsec的monadic函数getState,putState和modifyState,但我似乎无法在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)
Run Code Online (Sandbox Code Playgroud)
此外,我们还可以使用大部分的Attoparsec组合子开箱,因为他们有泛型类型有Alternative,MonadPlus,Applicative或Monad约束和StateT界定提升通过实例对这些.我们可以使用lift基本的Parser-s.
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |