Parsing 在解析期间对不同类型的术语进行分区

Parsing 在解析期间对不同类型的术语进行分区,parsing,haskell,parsec,Parsing,Haskell,Parsec,对于不同类型的术语,我有两个解析器 a :: Parser A b :: Parser B 我有一个表示这些术语序列的数据类型 data C = C [A] [B] 如果我的输入是一个混合术语序列,那么编写c::Parser c以将as与Bs分开,并保持顺序的好方法是什么?例如,根据以下定义: data A = A Char data B = B Char a = A <$> oneOf "Aa" b = B <$> oneOf "Bb" data A=A字符 数据

对于不同类型的术语,我有两个解析器

a :: Parser A
b :: Parser B
我有一个表示这些术语序列的数据类型

data C = C [A] [B]
如果我的输入是一个混合术语序列,那么编写
c::Parser c
以将
a
s与
B
s分开,并保持顺序的好方法是什么?例如,根据以下定义:

data A = A Char
data B = B Char
a = A <$> oneOf "Aa"
b = B <$> oneOf "Bb"
data A=A字符
数据B=B字符
a=Aa中的一个
b=b“Bb”中的一个

“ababbbba”
将解析为序列
aAA
bbbbbb
。我有一种感觉,我需要使用
StateT
,但我不确定具体细节,只需要朝正确的方向推进。

一个简单的解决方案是首先将其解析为
列表,或者a B
,然后使用它将其拆分为两个列表,然后应用
C
构造函数

c :: Parser C
c = uncurry C . partitionEithers <$> many ((Left <$> a) <|> (Right <$> b))
c::解析器c
c=未结婚的c。多个分区((左a)(右b))

为了解决您的问题,我将使用数据中的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)
c::解析器c
c=(post.partitionEithers)许多1 aORb
哪里
职位(as,bs)=C as bs
aORb::解析器(A或B)
aORb=(左a)(右b)
编辑-


太好了,非常感谢。在我的脑海里,我肯定是把它复杂化了。