我建议不要使用fail来告诉我,之后会删除它。
在以下Parsers/Trifecta示例中应该正确使用什么而不是失败?
parserNaturalNoLeadZero :: Parser Integer
parserNaturalNoLeadZero = do
digits <- some digit
if length digits > 1 && head digits == '0'
then fail "Leading Zeros"
else return $ read digits
答案 0 :(得分:4)
答案 1 :(得分:1)
秒差距:
连击:
唯一的区别是他们产生的错误信息。
对意外令牌使用module_info = client[db1][t].find().distinct("module_name")
。 unexpected
会产生错误消息,例如unexpected "token"
。
使用(<?>)
使用它们代表的高级构造注释解析器。
这通常在设置备选方案的末尾使用,我们希望根据更高级别的构造返回错误消息,而不是返回所有可能的字符。
"unexpected: 'token'"
parseExpr = ... <?> "expression"
parseId = ... <?> "identifier"
parseTy = ... <?> "type"
不会产生任何错误消息。回溯并让另一个分支成功或负责报告有意义的错误仍然有用。
将empty
用于其他类型的错误,图书馆无法对其中的内容进行多少假设,因此他们可能会将其参数视为原始消息。