Поддерживает ли Haskell отладку? - PullRequest
0 голосов
/ 25 мая 2018

Например, это функция:

iffthen :: [String] -> Parser String
iffthen a = do 
x <- symbol (head a)
               y <- booleana (head (tail a))
               z <- symbol (head (tail (tail a)))
               k <- assignP (head (tail (tail (tail a))))
               l <- symbol (head (tail (tail (tail (tail a)))))
               m <- assignP (head (tail (tail (tail (tail (tail a))))))
               return k

Мне нужно посмотреть, что на самом деле делают все инструкции

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

В дополнение к trace проверьте traceM :: Applicative f => String -> f () и traceShowM :: (Show a, Applicative f) => a -> f ().

Это удобные замены putStrLn и print, доступные в любом контексте монады:

iffthen :: [String] -> Parser String
iffthen a = do 
x <- symbol (head a)
               traceM "booleana"
               y <- booleana (head (tail a))
               traceM "symbol 1"
               z <- symbol (head (tail (tail a)))
               traceM "assignP 1"
               k <- assignP (head (tail (tail (tail a))))
               traceM "symbol 2"
               l <- symbol (head (tail (tail (tail (tail a)))))
               traceM "assignP 2"
               m <- assignP (head (tail (tail (tail (tail (tail a))))))
               return k

Если вас интересует результат каждого парсера, используйте traceShowId с <$> и т. Д.

iffthen :: [String] -> Parser String
iffthen a = do 
x <- symbol (head a)
               y <- traceShowId <$> booleana (head (tail a))
               z <- traceShowId <$> symbol (head (tail (tail a)))
               k <- traceShowId <$> assignP (head (tail (tail (tail a))))
               l <- traceShowId <$> symbol (head (tail (tail (tail (tail a)))))
               m <- traceShowId <$> assignP (head (tail (tail (tail (tail (tail a))))))
               return k
0 голосов
/ 03 июня 2018

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

0 голосов
/ 25 мая 2018

Вы можете использовать trace :: String -> a -> a из Debug.Trace или связанные с ними функции, такие как traceShowId :: Show a => a -> a.Эта функция в основном печатает прикрепленный параметр String в случае оценки функции и возвращает результат функции.

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

Об этой функции я бы посоветовал использовать сопоставление с образцом здесь и удалитьшум неиспользуемых переменных:

iffthen :: [String] -> Parser String
iffthen <b>(ifs : cond : thens : val1 : elses : val2 : _)</b> = do 
    symbol <b>ifs</b>
    booleana <b>cond</b>
    symbol <b>thens</b>
    k <- assignP <b>val1</b>
    symbol <b>elses</b>
    assignP <b>val2</b>
    return k

(Учитывая, что я правильно интерпретировал, что вы хотите, и ifs, thens, elses - символы, cond - условие, а val1 иval2 - это значения выражения if - then - else).

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

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