我是函數式編程的新手,我想調試遞歸函數以查看爲什麼我將特定值作爲返回值。我如何實現這一目標?我在這個網站以及在線上發現了一些答案,但是我無法繞過這個想法。任何幫助,將不勝感激。調試Haskell
recur = \a -> if a>100 then a-10 else recur (recur (a+11))
我是函數式編程的新手,我想調試遞歸函數以查看爲什麼我將特定值作爲返回值。我如何實現這一目標?我在這個網站以及在線上發現了一些答案,但是我無法繞過這個想法。任何幫助,將不勝感激。調試Haskell
recur = \a -> if a>100 then a-10 else recur (recur (a+11))
你可以這樣做(使用Debug.Trace
):
import Debug.Trace (trace)
recur a | trace ("recur " ++ show a) False = undefined
recur a = if a>100 then a-10 else recur (recur (a+11))
這將產生輸出的每個功能recur
被稱爲(或相當的時間,因爲Haskell是惰性的,每次申請recur
的結果是需要)。
樣本輸出(在ghci中):
*Main> recur 99
recur 99
recur 110
recur 100
recur 111
recur 101
91
你真的不能在Haskell調試傳統意義上的,因爲哈斯克爾,是純粹的功能性語言,執行過程中不會改變狀態。也就是說,我通常通過紙上的遞歸算法來追蹤。 – Tetramputechture
我試圖在紙上追蹤它,但它導致無限循環。但是當我在haskell中運行函數時,它返回結果。所以,Haskell必須停止評估我傳遞的論點,並且我不知道哪個論點。 – user30646
@Tetramputechture不是。有['Debug.Trace'](https://hackage.haskell.org/package/base-4.8.1.0/docs/Debug-Trace.html),還有GHCi中的調試命令。也就是說,在紙上追蹤算法確實是一個非常好的建議。 – duplode