gpt4 book ai didi

debugging - 如何在惰性函数式编程语言中实现调试?

转载 作者:行者123 更新时间:2023-12-03 06:33:21 26 4
gpt4 key购买 nike

我想知道如何在惰性函数语言中实现调试。
你能使用断点、打印语句和传统技术吗?这甚至是个好主意吗?
我的理解是纯函数式编程不允许副作用,除了 monad。
执行顺序也不能保证。
您是否必须为要测试的每一段代码编写一个 monad?
我想从这个领域更有经验的人那里得到一些关于这个问题的见解。

最佳答案

没有什么能阻止您在延迟评估的函数式程序中使用断点。急切求值的不同之处在于程序何时会在断点处停止以及跟踪的外观。当设置断点的表达式实际上正在减少时(显然),程序将停止。

而不是你习惯的堆栈跟踪,你得到的减少导致了带有断点的表达式的减少。

愚蠢的小例子。你有这个 Haskell 程序。

add_two x = 2 + x

times_two x = 2 * x

foo = times_two (add_two 42)

然后在第一行 ( add_two ) 放置一个断点,然后计算 foo .当程序在断点处停止时,在一种急切的语言中,您希望有类似的跟踪
add_two
foo

times_two甚至还没有开始评估,但是在 GHCi 调试器中你得到
-1  : foo (debug.hs:5:17-26)
-2 : times_two (debug.hs:3:14-18)
-3 : times_two (debug.hs:3:0-18)
-4 : foo (debug.hs:5:6-27)
<end of history>

这是导致您放置断点的表达式减少的减少列表。请注意,它看起来像 times_two “叫” foo即使它没有明确地这样做。从中可以看出 2 * x的评价在 times_two (-2) 确实强制评估 (add_two 42) (-1) 来自 foo线。从那里您可以像在命令式调试器中一样执行一个步骤(执行下一个缩减)。

使用 Eager 语言进行调试的另一个区别是变量可能尚未评估 thunk。例如,在上述跟踪的第 -2 步并检查 x ,你会发现它仍然是一个未评估的 thunk(在 GHCi 中用括号表示)。

有关更详细的信息和示例(如何单步执行跟踪、检查值等),请参阅 the GHCi Debugger section在 GHC 手册中。还有 Leksah IDE由于我是 VIM 和终端用户,所以我还没有使用过,但是根据手册,它具有 GHCi 调试器的图形前端。

您还要求打印报表。只有使用纯函数,这并不容易,因为打印语句必须在 IO monad 中。所以,你有一个纯函数
foo :: Int -> Int

并希望添加一个跟踪语句,打印将在 IO monad 中返回一个 Action ,因此您必须调整要放入​​该跟踪语句的函数的签名,以及调用它的函数的签名, ...

这不是一个好主意。因此,您需要某种方式来打破纯度以实现跟踪语句。在 Haskell 中,这可以通过 unsafePerformIO 来完成。 .有 Debug.Trace 已有功能的模块
trace :: String -> a -> a

它输出字符串并返回第二个参数。写成纯函数是不可能的(好吧,如果你打算真正输出字符串,那就是)。它使用 unsafePerformIO在引擎盖下。您可以将其放入纯函数中以输出跟踪打印。

Would you have to program a monad for every section of code you want to test?



我建议相反,使尽可能多的函数成为纯函数(我在这里假设您的意思是用于打印的 IO monad,monad 不一定是不纯的)。惰性评估允许您非常干净地将 IO 代码与处理代码分开。

命令式调试技术是否是一个好主意取决于情况(像往常一样)。我发现使用 QuickCheck/SmallCheck 进行测试比使用命令式语言进行单元测试更有用,所以我会先走这条路,以避免尽可能多的调试。 QuickCheck 属性实际上做出了简洁明了的函数规范(命令式语言中的许多测试代码对我来说就像是另一 block 代码)。

避免大量调试的一个技巧是将函数分解为许多较小的子函数并尽可能多地测试它们。当来自命令式编程时,这可能有点不寻常,但无论您使用哪种语言,这都是一个好习惯。

再说一次,调试!= 测试,如果某处出现问题,断点和跟踪可能会帮助你。

关于debugging - 如何在惰性函数式编程语言中实现调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1303794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com