Parsing <|&燃气轮机;在Parsec中-为什么这些示例的行为不同?

Parsing <|&燃气轮机;在Parsec中-为什么这些示例的行为不同?,parsing,haskell,parsec,Parsing,Haskell,Parsec,我想我误解了parsec中的——我有一个输入流,在一个表示中包含一堆as,或者在另一个表示中包含一堆as。我希望以下函数是等效的(假设输入是我所说的形式,并且我已经验证了它是等效的): foo=do ... a1s当您给后面的解析器一个a2序列时,第一个many匹配并返回一个空列表,因此它不会尝试与第二个many匹配 您可以改用many1 foo = do ... as <- many1 a1 <|> many a2 return as foo=do

我想我误解了parsec中的
——我有一个输入流,在一个表示中包含一堆
a
s,或者在另一个表示中包含一堆
a
s。我希望以下函数是等效的(假设输入是我所说的形式,并且我已经验证了它是等效的):

foo=do
...

a1s当您给后面的解析器一个a2序列时,第一个
many
匹配并返回一个空列表,因此它不会尝试与第二个
many
匹配

您可以改用
many1

foo = do
    ...
    as <- many1 a1 <|> many a2
    return as
foo=do
...

与第一个示例一样,它执行
many$try$a1
,然后执行
many$try$a2
,两者都始终执行。在第二种情况下,它执行
many$try$a1
,如果失败,则执行
many$try$a2
foo = do
    ...
    as <- (many $ try $ a1) <|> (many $ try $ a2)
    return as
foo = do
    ...
    as <- many1 a1 <|> many a2
    return as