我是函数式编程的新手,我想调试递归函数以查看为什么我将特定值作为返回值。我如何实现这一目标?我在这个网站以及在线上发现了一些答案,但是我无法绕过这个想法。任何帮助,将不胜感激。调试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