我正在使用Trifecta库学习解析器组合器。我被介绍给Alternative类型类,它是<|>函数。
我的代码中有一个解析器函数,其定义是
fractionOrDecimal :: Parser DoubleOrRational
fractionOrDecimal =
(Left <$> try parseDecimal) -- A
<|> (Right <$> try parseFraction) -- B
<|> (fail "Expected Fraction or Decimal.") -- Err
尝试将输入解析为十进制或小数,如果没有任何作用,则失败。这种方法是正确的还是我应该对故障(fail)进行不同的编码,而不是作为<|>操作的一部分。
答案 0 :(得分:4)
失败是由没有成功的解析器进行编码的。 Trifecta会为您跟踪预期的令牌,但是您必须使用<?>
告诉它们它们叫什么。所以你会做
fractionOrDecimal :: Parser DoubleOrRational
fractionOrDecimal =
(Left <$> try parseDecimal <?> "Decimal")
<|> (Right <$> try parseFraction <?> "Fractional")
我们现在收到这样的错误:
>>> parseTest fractionalOrDecimal "neither fractional nor decimal"
error: expected: Decimal, Fractional
neither fractional nor decimal<EOF>
^