Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 在GHC程序中检测无限循环_Haskell_Ghc - Fatal编程技术网

Haskell 在GHC程序中检测无限循环

Haskell 在GHC程序中检测无限循环,haskell,ghc,Haskell,Ghc,在本例中,action是错误创建的无限循环。在GHC程序中是否有检测此类循环的方法 action bucket manager url = catch (action bucket manager url) (\(e :: HttpException) -> Logger.warn $ "Problems with " ++ url) 简短回答:没有 当然,不可能注意到每个人可以写下的无限循环;这就是众所周知的循环检测程序,而不能编写循环检测程序的正式证明是

在本例中,
action
是错误创建的无限循环。在GHC程序中是否有检测此类循环的方法

   action bucket manager url = catch
      (action bucket manager url)
      (\(e :: HttpException) -> Logger.warn $ "Problems with " ++ url)
简短回答:没有

当然,不可能注意到每个人可以写下的无限循环;这就是众所周知的循环检测程序,而不能编写循环检测程序的正式证明是如此著名,甚至有


当然,对于不可判定的问题,也有一个致力于尽最大努力的方法,理论上我们知道很多检测这种无限循环的简单版本的方法。然而,据我所知,还没有人做过必要的工程工作,把这个理论变成一个可以在Haskell source上轻松运行的工具。

我想这是一个后续的工作

一般来说,没有办法自动检测每个无限循环。在实践中,我认为通过查看CPU和内存使用情况来手动检测它们通常是合理的,这并不特定于GHC。这种特殊情况应该会耗尽内存,因为它不是尾部递归的(至少,我认为这是原因)。像
action x y z=action x y z
这样的东西不会分配,因此会无限期地旋转,在不增加内存使用的情况下使CPU最大化。这将取决于您对执行时间和内存使用的预期,并调查任何偏差


我没有尝试过这种方法,但是如果您怀疑存在无限循环,也许可以使用
xc
RTS选项并中断执行以获取堆栈跟踪。

有些语言(如Idris)支持总体检查-当然可以为GHC编写一个总体检查扩展,尽管我不知道。但是,由于停止问题的不确定性,没有一个总体检查器将接受所有停止的程序,同时拒绝所有未停止的程序。同意。实际上,我希望在
GHC
的情况下,会有一些关于程序行为的运行时提示,这些程序是非生产性地消耗CPU的。特别是在内存耗尽之前,我没有看到内存消耗情况。例如,我的线程是否遗漏了一些“安全点”?@sevo我不确定我是否理解这个问题。您是说您运行了分析,但没有看到任何分析输出?如果是这样的话,这似乎是一个完全不同的问题,我鼓励你用一个最小的复制示例打开一个新的so帖子。“然而,据我所知,没有人做过必要的工程工作,将该理论转化为一个可以在Haskell源代码上轻松运行的工具。”--也许在编译阶段没有,但GHC的运行时系统已经做了相当长一段时间的简单“黑洞”无限循环检测。请参阅以获取一些信息。@Desty,不幸的是,它太简单了,以至于它甚至无法捕捉问题中给出的示例,其中函数实际上使用完全相同的参数调用自己。@DanielWagner;也许函数的某些方面,或者它是如何包装在一个“捕获”中的,意味着探测器没有注意到它。只是指出,在某些情况下,已经做了一些工作使之成为可能。