2012-05-02 28 views
3

對於不同類型的術語,我有兩個解析器。解析期間對不同類型的術語進行分區

a :: Parser A 
b :: Parser B 

我有一個數據類型代表這些術語的序列。

data C = C [A] [B] 

如果我輸入的混合條款的順序,什麼是寫c :: Parser CA■從B小號分開,維護他們的訂單的好方法?例如,給定這些定義:

data A = A Char 
data B = B Char 
a = A <$> oneOf "Aa" 
b = B <$> oneOf "Bb" 

"abAbBBA"將解析到序列aAAbbBB。我有一種感覺,我需要使用StateT,但我不確定具體情況,只需要朝正確的方向推動。

回答

7

一個簡單的解決方案是首先將其解析爲Either A B列表,然後使用partitionEithers將其拆分成兩個列表,然後將其應用於構造函數C

c :: Parser C 
c = uncurry C . partitionEithers <$> many ((Left <$> a) <|> (Right <$> b)) 
+0

非常好,非常感謝。在我的腦海中,我絕對是過於複雜。 –

4

爲了解決我會使用partitionEithers從Data.Either您的問題,代碼未被選中,但它不應該是不遠了......

c :: Parser C 
c = (post . partitionEithers) <$> many1 aORb 
    where 
    post (as,bs) = C as bs 


aORb :: Parser (Either A B) 
aORb = (Left <$> a) <|> (Right <$> b) 

編輯 -

快照!

相關問題