Haskell实现没有堆栈?

时间:2011-11-16 23:49:20

标签: haskell stack continuations stackless graph-reduction

来自How does a stackless language work?

Haskell (as commonly implemented) does not have a call stack; 
evaluation is based on graph reduction.

真的?这很有意思,因为虽然我自己从未体验过它,但我已经读过,如果你不使用折叠函数的严格版本然后强制评估无限折叠,你会得到堆栈溢出。当然,这表明存在堆栈。任何人都可以澄清吗?

2 个答案:

答案 0 :(得分:8)

我不是这方面的专家,但我认为你引用的答案并不完全准确。 Haskell没有大多数命令式语言的直接堆栈类型,您可以通过程序跟踪调用路径。由于它的懒惰,评估基于图形缩减,您可以阅读here,但调用最终仍然放在堆栈中。根据{{​​3}}页面,“GHC执行引擎中的”堆栈“与词汇调用堆栈几乎没有相似之处。”所以是的,有一个堆栈,但它与你在命令式语言中找到的堆栈非常不同,并且它是使用图形缩减创建的。

答案 1 :(得分:1)

Haskell不是“无堆叠”或类似的东西。从Haskell源生成的代码仍然具有某种符号,执行显示一些堆栈跟踪,但它们与源代码的关系非常松散。以下是有关简化调试/跟踪/分析的尝试的一些信息:

http://www.haskell.org/wikiupload/9/9f/HIW2011-Talk-Marlow.pdf