3

異なるタイプの用語に対して2つのパーサーがあります。

a :: Parser A
b :: Parser B

これらの用語のシーケンスを表すデータ型があります。

data C = C [A] [B]

私の入力が一連の混合用語である場合、 sをsからc :: Parser C分離し、それらの順序を維持するための良い書き方は何ですか?たとえば、次の定義があります。AB

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

"abAbBBA"aAAシーケンスとを解析しbbBBます。使用する必要があると感じていますStateTが、詳細がわからないため、正しい方向にプッシュする必要があります。

4

2 に答える 2

7

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

c :: Parser C
c = uncurry C . partitionEithers <$> many ((Left <$> a) <|> (Right <$> b))
于 2012-05-02T16:41:01.870 に答える
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)

編集 -

スナップ!

于 2012-05-02T16:43:43.167 に答える