Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 循环语义学的一大步,我不断得到一个无限循环_Haskell_For Loop_Semantics_Infinite Loop - Fatal编程技术网

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)不是必需的(并且混淆了我的心智分析器;-)。还有更多的非惯用括号和缺少的空格。