2012-05-02 7 views
3

異なるタイプの用語に対して2つのパーサーがあります。構文解析中に異なるタイプの用語を分割する

a :: Parser A 
b :: Parser B 

私は、これらの用語のシーケンスを表すデータ型を持っています。

data C = C [A] [B] 

私の入力は混合用語のシーケンスである場合は、その順序を維持し、B sからA Sを分離するためにc :: Parser Cを書くの良い方法は何ですか?

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

"abAbBBA"シーケンスaAAbbBBに解析します:たとえば、これらの定義が与えられました。 StateTを使用する必要があると感じていますが、具体的な内容が不明で、正しい方向にプッシュするだけです。

答えて

7

簡単な解決策は、最初のEither A Bのリストにそれを解析して、あなたが、その後にCコンストラクタを適用する二つのリストにこれを分割するpartitionEithersを使用することです。

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

非常にありがとうございます。私は間違いなく私の心の中でそれをovercomplicatedていた。 –

4

私はData.EitherからpartitionEithersを使用したいあなたの問題を解決するために、コードがオフになっているが、それは遠くではありません...

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) 

編集 -

スナップ!

関連する問題