Разыскивание ошибок в Хаскелле

Как я могу получить больше информации о том, где ошибка Хаскелла произошла? Например, вчера я работал над программой Хаскелла, которая разбирает входной файл, преобразовывает данные и затем распечатывает сообщающую информацию.

Однажды, я бежал «главный» и возвращенный

*** Prelude.read: parse error

без другой информации. К счастью, я знал, что называл прочитанным только в одном месте и смог зафиксировать его, но для будущего:

  • Действительно ли возможно получить след или номер линии для ошибок как они?
  • Действительно ли возможно получить фактические данные, которые вызвали ошибку, т.е. последовательность, которая вызвала ошибку разбора?

Спасибо!

Отредактируйте Используя GHC.

14
задан Bill 26 January 2010 в 13:26
поделиться

4 ответа

Вы можете получить строку, вызванную ошибкой разбора, импортируя 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)
6
ответ дан 1 December 2019 в 13:09
поделиться

Я хотел бы использовать создание HTML-файлов из шаблонов и превратить их в PDF с Prince . Prince очень гибкая и создание HTML-файлов из шаблонов гораздо проще, чем создание PDF-файлов напрямую.

-121--2843401-

тип в стиле списка: верхнеримский;

-121--3510037-

Вы не сообщили нам, какой компилятор вы используете. При использовании GHC следует просмотреть отладчик GHCi .

Трассировка стека в Haskell не является тривиальной из-за его лени. Тем не менее, вышеупомянутый отладчик предоставляет некоторые инструменты (см. раздел 2.5.5. Трассировка и история в указанном выше URL).

2
ответ дан 1 December 2019 в 13:09
поделиться
121 --- 4482020-121 --- 4482020

В целом это зависит от вас, чтобы справиться с ошибкой таким образом, что для вас достаточно контекста, чтобы отладить причину.

Ленивость haskell затрудняет реализацию следов стека, потому что в течение большего времени стек вызовов может больше не существовать, когда произойдет ошибка.

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

Наконец, в вашем конкретном случае прочитал , выбрасывает исключение, чтобы вы могли поймать это, а затем обрабатывать ошибку в вызывающем коде (посмотреть в Control.Exception ] упаковка).

3
ответ дан 1 December 2019 в 13:09
поделиться

Вы можете рассмотреть возможность использования монадического чтения , как в «Практический 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] 
 
1
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: