Обработка ошибок в функции Parser - PullRequest
0 голосов
/ 27 января 2019

Я изучаю Parser Combinators с библиотекой Trifecta .Меня познакомили с альтернативным классом типов и его функцией <|>.

В моем коде появилась функция Parser, определение которой

fractionOrDecimal :: Parser DoubleOrRational
fractionOrDecimal =
        (Left <$> try parseDecimal)                  -- A
    <|> (Right <$> try parseFraction)                -- B
    <|> (fail  "Expected Fraction or Decimal.")      -- Err

, которая пытается проанализироватьвведите как десятичное число или дробь и потерпите неудачу, если ничего не работает.Является ли этот подход правильным или я должен кодировать ошибку (ошибка) иначе, чем являясь частью операции <|>.

1 Ответ

0 голосов
/ 27 января 2019

Ошибка кодируется отсутствием успешного парсера.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> 
^                       
...