Haskell 循环语义学的一大步,我不断得到一个无限循环
虽然这只是代码的一部分,但有人能解释为什么我得到一个无限循环吗 这就是语义支持的大步Haskell 循环语义学的一大步,我不断得到一个无限循环,haskell,for-loop,semantics,infinite-loop,Haskell,For Loop,Semantics,Infinite Loop,虽然这只是代码的一部分,但有人能解释为什么我得到一个无限循环吗 这就是语义支持的大步 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)) 无限循环很可能来自代码的不同部分。您提供的代
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
函数用于调试。这就像使用print语句在任何其他语言中进行调试一样。(在内部,它使用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))
这将在每一步打印出计数器的条件和值。这将帮助您找出循环的来源。如果没有,您可以使用与我在这里相同的方法移动跟踪语句。bEval周围的括号(比较Leq iexp(IConst 0),s)不是必需的(并且混淆了我的心智分析器;-)。还有更多的非惯用括号和缺少的空格。