Я не уверен относительно правильного способа сообщения об ошибках из 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
(хотя с информацией о стеке и строках я бы не хотел сообщать в этом контексте).
Итак, у меня есть три связанных вопроса:
- Есть ли какая-либо причина не сообщать полную информацию об ошибках из
read
, используя Left err -> error (show err)
?
- Если это так и требуется что-то вроде
Left err -> []
, как мне сообщить read
или об ошибках конструктора в командной строке?
и (не так важно)
- Как мне избавиться от строки информации стека при сообщении от
read
в моем main = do ...
?