如何在haskell中编写回溯连接解析器

如何在haskell中编写回溯连接解析器,haskell,parsec,Haskell,Parsec,我正在尝试从连接的解析器中创建一个解析器,以便在parsec中回溯 代码如下: ab = (try $ char 'a') <|> (try $ char 'b') cd = (try $ char 'b') <|> (try $ char 'c') abcd = (try $ many1 ab) >> (try cd) 输入“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

我正在尝试从连接的解析器中创建一个解析器,以便在parsec中回溯

代码如下:

ab = (try $ char 'a') <|> (try $ char 'b')
cd = (try $ char 'b') <|> (try $ char 'c')
abcd = (try $ many1 ab) >> (try cd)
输入“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 但它在“aaaaaab”上有错误,这应该是可以接受的

关于我能做些什么来让它工作,有什么见解吗


提前感谢

那么您正在尝试用Haskell编写正则表达式
(a | b)+(b | c)
?这就是你要做的:

import Text.Parsec.String
导入文本.Parsec
ab::解析器字符
ab=字符“a”字符“b”
分析器字符
bc=字符“b”字符“c”
解析字符串
abc=do
解析器“aaaaaaaaaaaaaab”
右“AAAAAAAA B”
*Main>
离开GHCi。
这是怎么回事?让我们逐个解析器来理解它:

ab::解析器字符
ab=字符“a”字符“b”
分析器字符
bc=字符“b”字符“c”
这两个解析器很简单。它们分别对应于正则表达式
(a | b)
(b | c)

abc::解析器字符串
abc=do

aAadit的答案很好。或者,如果您只想解析文本而不需要任何返回值,则可以使用
manyTill

import Text.Parsec
导入Text.Parsec.Char
导入Text.Parsec.String
ab::解析器字符
ab=字符“a”字符“b”
分析器字符
bc=字符“b”字符“c”
abbc::解析器()
abbc=ab>>manyTill ab bc>>返回()
它的工作原理是:

> parse abbc "" "aaaaaaaaaaaaaac"
Right ()
> parse abbc "" "aaaaaaaaaaaaaab"
Right ()

但是,如果您确实想要解析的文本,那么
manyTill
就不那么方便了,因为它只返回第一个参数解析的值,而不是第二个参数解析的值。(在本例中,我通过调用
return()
丢弃了这些值)

这是cd中的一个打字错误吗?a b而不是d?顺便说一句,
abc=sequence[ab,bc]
abbc=试试abc(:)ab abbc)
@maxtaldykin这很好,但我觉得一元代码比
sequence
或applicative functor更容易解释。是的,当然,这只是好奇读者的旁注。所以如果我想要很多ab而不是很多abc,我想要abbc=试试bc((:)ab abbc)?
> parse abbc "" "aaaaaaaaaaaaaac"
Right ()
> parse abbc "" "aaaaaaaaaaaaaab"
Right ()