gpt4 book ai didi

haskell - 循环的大步语义,我不断得到一个无限循环

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

虽然这只是代码的一部分,但可以解释为什么我会陷入无限循环
这就是大步语义的样子

enter image description here

eval (For iexp c, s)
|(bEval (Compare Leq iexp (IConst 0), s)) = s
|otherwise = eval (For n' c, s')
where
s' = eval(c,s)
n' = (IBin Minus iexp (IConst 1))

最佳答案

无限循环很可能来自代码的不同部分。您提供的代码段看起来是正确的,并且 - 适本地模拟了必要的类型和函数 - 终止。

也许您没有正确评估减法?另一种可能是bEval不能正常工作。

这是 Data.Trace 的一个很好的用例,它提供了一个 trace调试功能。这就像在任何其他语言中使用打印语句进行调试一样。 (在内部,它使用 unsafePerformIO 。)
trace函数接受一个字符串和一个表达式;它打印字符串并返回表达式。还有一个traceShow使用 show 的函数在打印前的论据上。

您可以使用它在循环执行时打印出中间值。我建议这样的事情:

eval (For iexp c, s)
| condition `traceShow` condition = s
| otherwise = n' `traceShow` eval (For n' c, s')
where condition = bEval (Compare Leq iexp (IConst 0), s)
s' = eval(c,s)
n' = (IBin Minus iexp (IConst 1))

这将在每一步打印出计数器的条件和值。这应该可以帮助您找出循环的来源。如果没有,您可以移动跟踪语句,使用方式与我在此处相同。

关于haskell - 循环的大步语义,我不断得到一个无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15698095/

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