2015-09-06 53 views
1

我是函數式編程的新手,我想調試遞歸函數以查看爲什麼我將特定值作爲返回值。我如何實現這一目標?我在這個網站以及在線上發現了一些答案,但是我無法繞過這個想法。任何幫助,將不勝感激。調試Haskell

recur = \a -> if a>100 then a-10 else recur (recur (a+11)) 
+0

你真的不能在Haskell調試傳統意義上的,因爲哈斯克爾,是純粹的功能性語言,執行過程中不會改變狀態。也就是說,我通常通過紙上的遞歸算法來追蹤。 – Tetramputechture

+0

我試圖在紙上追蹤它,但它導致無限循環。但是當我在haskell中運行函數時,它返回結果。所以,Haskell必須停止評估我傳遞的論點,並且我不知道哪個論點。 – user30646

+3

@Tetramputechture不是。有['Debug.Trace'](https://hackage.haskell.org/package/base-4.8.1.0/docs/Debug-Trace.html),還有GHCi中的調試命令。也就是說,在紙上追蹤算法確實是一個非常好的建議。 – duplode

回答

6

你可以這樣做(使用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 
+1

與警衛的巧妙訣竅。 – duplode

+1

@duplode我從http://okmij.org/ftp/Haskell/#making-function-strict偷走了它。 – melpomene