我认为我在parsec中误解了<|>
- 我有一个输入流,在一个表示中包含一堆a
s或者包含a
个另一种表示。我希望以下函数是等价的(假设输入是我说的形式,我已经验证它是):
foo = do
...
a1s <- many $ try $ a1
a2s <- many $ try $ a2
return $ a1s ++ a2s
与
foo = do
...
as <- (many $ try $ a1) <|> (many $ try $ a2)
return as
可能出现什么问题?第一个函数对我的输入有效,第二个函数失败,说出意外的a2,期待a1。
答案 0 :(得分:2)
当您向后一个解析器提供a2序列时,第一个many
匹配并返回一个空列表,因此它不会尝试与第二个many
匹配。
您可以改为使用many1
。
foo = do
...
as <- many1 a1 <|> many a2
return as
在这种情况下,many1
在给出a2序列时失败,many
与输入匹配。