2015-09-06 48 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