[英]Parsec debugging
我一直在使用parsec,我在調試代碼時遇到問題。 例如,我可以在ghci中設置斷點,但我不知道如何查看已經消耗了多少輸入,或者類似的東西。
是否有工具/指南來幫助調試parsec代碼?
此頁面可能有所幫助。
Debug.trace
是你的朋友,它允許你基本上做一些printf
調試。 它評估並打印其第一個參數,然后返回其第二個參數。 所以,如果你有類似的東西
foo :: Show a => a -> a
foo = bar . quux
您可以通過將foo
更改為以下內容來調試foo參數的'value':
import Debug.Trace(trace)
foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) x
foo現在的工作方式和以前一樣,但是當你調用foo 1
它會在評估時打印x is: 1
到stderr。
要進行更深入的調試,您需要使用GHCI的調試命令。 具體來說,它聽起來像你正在尋找:force
命令,它強制評估變量並將其打印出來。 (替代方法是:print
命令,打印盡可能多的已經評估的變量,而不再進行評估。)
請注意:force
更有助於計算變量的內容,但也可能會更改程序的語義(如果您的程序依賴於懶惰)。
一般的GHCI調試工作流程如下所示:
:break
來設置斷點 :list
和:show context
來檢查您在代碼中的位置 :show bindings
檢查變量綁定 :print
來查看當前綁定的內容 :force
必要時:force
檢查綁定 如果您正在嘗試調試無限循環,它也有助於使用
:set -fbreak-on-error
:trace myLoopingFunc xy
然后你可以在循環期間Ctrl-C
並使用:history
來查看循環的內容。
另一個有用的技巧
_ <- many anyChar >>= fail
這會產生一個錯誤( Left
):
unexpected end of input
the remaining 'string'
我認為這里提到的parserTrace
和parserTraced
函數http://hackage.haskell.org/package/parsec-3.1.13.0/docs/Text-Parsec-Combinator.html#g:1做了類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.