Как скрипт командной строки на Haskell должен сообщать об ошибках из `read`? - PullRequest
0 голосов
/ 01 ноября 2018

Я не уверен относительно правильного способа сообщения об ошибках из read создания экземпляра в ответ на пользовательский ввод в командной строке в main = do ....

В частности, у меня есть конструктор , который проверяет свои аргументы и сообщает об ошибке обычным способом

-- ...
Right cfg  -> cfg
Left err -> error (show err)

и реализация read, которая использует этот конструктор. Однако внутри моей реализации у меня есть загадочное примечание (унаследованное от некоторых давних исследований, которые я с тех пор потерял), которое удаляет информацию об ошибках

instance Read ... where
        readsPrec _ i = case ...
            Right cfg  -> [(cfg, "")]
            Left _ -> [] -- Loses error information, but conforms to specification of 'readsPrec' in 'Read'

чтобы мой анализатор командной строки

main :: IO ()
main = do
    ... read

сообщает обо всех ошибках, сгенерированных конструктором, просто

Prelude.read: no parse

Если я проигнорирую свой загадочный комментарий и вместо получу

Left err -> error (show err)

в конструкторе, затем я получаю полную информацию об ошибке, сообщаемую пользователю:

script: Detailed error information here
  CallStack (from HasCallStack):
  error, called at ./Pkg/Module.hs:371:57 in main:Pkg.Module

(хотя с информацией о стеке и строках я бы не хотел сообщать в этом контексте).

Итак, у меня есть три связанных вопроса:

  1. Есть ли какая-либо причина не сообщать полную информацию об ошибках из read, используя Left err -> error (show err)?
  2. Если это так и требуется что-то вроде Left err -> [], как мне сообщить read или об ошибках конструктора в командной строке?

и (не так важно)

  1. Как мне избавиться от строки информации стека при сообщении от read в моем main = do ...?

1 Ответ

0 голосов
/ 03 ноября 2018
  1. Да: чистый код не может перехватить error звонки. Часто из чистого кода полезно знать, что read (ну, reads) не удалось.
  2. Используйте для анализа другой класс, отличный от Read, что позволяет более отчетливо сообщать об ошибках. Каждая из популярных библиотек синтаксического анализатора имеет средства для создания хороших отчетов об ошибках.
  3. Используйте образное имя errorWithoutStackTrace.
...