Parsing <|&燃气轮机;在Parsec中-为什么这些示例的行为不同?
我想我误解了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
——我有一个输入流,在一个表示中包含一堆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