在阅读 Haskell 的书时,我遇到了trifecta
我试图绕开我的头,但仍然无法理解 <|>
我有以下问题。
简单来说 (<|>) = Monadic 选择?
p = a <|> b -- 使用解析器a如果没有则使用b?
如果是,那么为什么下面的解析器失败了?
parseFraction :: Parser Rational
parseFraction = do
numerator <- decimal
char '/'
denominator <- decimal
case denominator of
0 -> fail "denominator cannot be zero"
_ -> return (numerator % denominator)
type RationalOrDecimal = Either Rational Integer
parseRationalOrDecimal = (Left <$> parseFraction) <|> (Right<$> decimal)
main = do
let p f i = parseString f mempty i
print $ p (some (skipMany (oneOf "\n") *> parseRationalOrDecimal <* skipMany (oneOf "\n"))) "10"
在完美世界中,如果 a 是parseFraction将失败,那么<|>
应该使用小数,但事实并非如此。但是当我使用尝试它的工作原理。
- 我错过了什么?
- 为什么我们需要在 <|> 应该在第一次失败时运行第二个解析器时使用try ?
parseRationalOrDecimal = try (Left <$> parseFraction) <|> (Right<$> decimal)