2015-05-28 10 views

cevap

5

StateT s Parser'u kullanarak, ayrıştırıcıda geriye dönük izlemenin de durumu geri aldığını, böylece yalnızca başarılı ayrıştırmayla kod yolunda çağrılan durumsal eylemleri aldığınızı unutmayın.

{-# 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) 

Ayrıca, Alternative, MonadPlus, Applicative veya Monad kısıtlamalarıyla jenerik türleri çünkü biz, kutudan çıktığı Attoparsec, bağdaştırıcılarla çoğunu kullanabilir ve StateT bunlar için asansör geçiş örneklerini tanımlar. Temel Parser -s için lift'u kullanabiliriz.

+0

Teşekkürler, çok takdir. Görünüşe göre burası bana Attoparsec'i kullanarak ulaşacak, ben de onu cevap olarak işaretleyeceğim. –