Как я могу получить больше информации о том, где ошибка Хаскелла произошла? Например, вчера я работал над программой Хаскелла, которая разбирает входной файл, преобразовывает данные и затем распечатывает сообщающую информацию.
Однажды, я бежал «главный» и возвращенный
*** Prelude.read: parse error
без другой информации. К счастью, я знал, что называл прочитанным только в одном месте и смог зафиксировать его, но для будущего:
Спасибо!
Отредактируйте Используя GHC.
Вы можете получить строку, вызванную ошибкой разбора, импортируя Debug.Trace
и меняется
Ваш звонок
import Debug.Trace (trace) --change myRead s = read s --to myRead s = trace s (read s) --or myRead s = trace (take 100 s) (read s)
Я хотел бы использовать создание HTML-файлов из шаблонов и превратить их в PDF с Prince . Prince очень гибкая и создание HTML-файлов из шаблонов гораздо проще, чем создание PDF-файлов напрямую.
-121--2843401-тип в стиле списка: верхнеримский;
-121--3510037-Вы не сообщили нам, какой компилятор вы используете. При использовании GHC следует просмотреть отладчик GHCi .
Трассировка стека в Haskell не является тривиальной из-за его лени. Тем не менее, вышеупомянутый отладчик предоставляет некоторые инструменты (см. раздел 2.5.5. Трассировка и история в указанном выше URL).
В целом это зависит от вас, чтобы справиться с ошибкой таким образом, что для вас достаточно контекста, чтобы отладить причину.
Ленивость haskell затрудняет реализацию следов стека, потому что в течение большего времени стек вызовов может больше не существовать, когда произойдет ошибка.
Простой способ обработки ошибок - это использовать любой тип, который позволяет вам вернуть значение, когда все пошло вправо, или какой-то контекст (сообщение об ошибке, входная строка, ...) в случае ошибки.
Наконец, в вашем конкретном случае прочитал
, выбрасывает исключение, чтобы вы могли поймать это, а затем обрабатывать ошибку в вызывающем коде (посмотреть в Control.Exception
] упаковка).
Вы можете рассмотреть возможность использования монадического чтения
, как в «Практический Haskell: создание сценариев оболочки с обработкой ошибок и разделением привилегий» другого пользователя StackOverflow dons :
Первый шаг - заменить
read
версией, преобразованной в общую монаду ошибок,MonadError
:readM :: (MonadError String m, Read a) => String -> ma readM s | [x] <- parse = return x | в противном случае = throwError $ "Failed parse:" ++ show s where parse = [x | (x, t) <- читает s]