我有两个用于不同类型术语的解析器。
a :: Parser A
b :: Parser B
我有一个表示这些术语序列的数据类型。
data C = C [A] [B]
如果我的输入是一系列混合词,那么写
c :: Parser C
的好方法是什么?分隔 A
来自 B
s,保持他们的秩序?例如,给定这些定义:data A = A Char
data B = B Char
a = A <$> oneOf "Aa"
b = B <$> oneOf "Bb"
"abAbBBA"
将解析为序列 aAA
和 bbBB
.我有一种感觉,我需要使用 StateT
,但我不确定具体情况,只需要朝着正确的方向插入。
最佳答案
一个简单的解决方案是首先将其解析为 Either A B
的列表然后使用 partitionEithers
将其拆分为两个列表,然后应用 C
构造函数到。
c :: Parser C
c = uncurry C . partitionEithers <$> many ((Left <$> a) <|> (Right <$> b))
关于parsing - 在解析过程中划分不同类型的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417821/