< |>在Parsec中 - 为什么这些例子表现不同?

时间:2014-04-06 22:40:49

标签: parsing haskell parsec

我认为我在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。

1 个答案:

答案 0 :(得分:2)

当您向后一个解析器提供a2序列时,第一个many匹配并返回一个空列表,因此它不会尝试与第二个many匹配。

您可以改为使用many1

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

在这种情况下,many1在给出a2序列时失败,many与输入匹配。