Лучшее исключение для неисчерпывающих паттернов в случае - PullRequest
5 голосов
/ 29 апреля 2010

Есть ли способ заставить GHCi генерировать лучшие сообщения об исключениях, когда он обнаруживает во время выполнения, что вызов произвел значение, которое не соответствует сопоставлению с образцом функции?

В настоящее время он дает номера строк функции, которая выявила неисчерпывающее совпадение с образцом, что, хотя иногда полезно, но требует раунд отладки, который, как мне кажется, иногда делает один и тот же набор вещей снова и снова. Поэтому, прежде чем пытаться составить решение, я хотел посмотреть, существует ли что-то еще.

Сообщение об исключении, которое, помимо указания номера строки, показывает, какой вызов он пытался сделать?

Возможно ли это вообще?

Ответы [ 2 ]

12 голосов
/ 29 апреля 2010

Попробуйте включить предупреждения в ghci. Это включает предупреждения времени компиляции, которые вы можете получить с помощью ghc, передав, например, -W. Вы можете сделать это несколькими способами:

ghci -fwarn-incomplete-patterns

Или Нил Митчелл описывает, как он это настраивает в своих .ghci. Вот соответствующая выдержка:

:set -fwarn-incomplete-patterns

Вы также можете ввести это вручную в ghci, но это будет болезненно делать каждый раз, когда вы его запускаете. Введенный таким образом, он работает только для операторов, введенных в приглашении, но не для загрузки файлов с :l. Вместо этого вы можете поместить этот комментарий вверху файла, который вы хотите предупредить о неполных шаблонах:

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
2 голосов
/ 29 апреля 2010

Я признаю, что это не ответ на ваш вопрос, но у меня сложилось впечатление, что среди опытных программистов на Haskell существует общее мнение, что в первую очередь следует избегать неисчерпывающих шаблонов, даже до точки использования -Werror для генерации ошибок вместо просто предупреждений.

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

Если вы хотите более радикальное решение для неисчерпывающих шаблонов, вы всегда можете портировать Catch для работы с современными версиями GHC. Хех.

Кроме того, если вы используете неисчерпывающие шаблоны, потому что функция действительно, действительно, никогда не должна вызываться с некоторыми значениями, пропущенные случаи можно заполнить чем-то вроде error $ "function foo called with ridiculous arguments " ++ show blahBlah, если знание недопустимых аргументов быть полезным. С другой стороны, вы можете попытаться переделать свой код или определить более специализированные типы данных, чтобы функции всегда могли делать что-то разумное с любым не нижним аргументом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...