Haskell中的延续与调用堆栈

时间:2015-06-13 22:51:11

标签: haskell ghc

Haskell(GHC)运行时如何知道在评估thunk之后应该执行哪些代码?

在概念层面上,与其他编程语言中的调用堆栈有什么不同(除了在堆上存储闭合变量并具有尾递归)?

1 个答案:

答案 0 :(得分:2)

GHC(或者更确切地说,GHC RTS)具有正常的调用堆栈,就像大多数事情一样。

这个堆栈的内容有什么不同。它与您的预期不符。

假设函数foo调用函数bar,它调用函数baz。您可能期望调用堆栈看起来像

foo
bar
baz

在某个时候。但实际上,当foo调用bar时,所有“调用”确实会创建一个thunk并立即返回。因此,bar在该点上不会出现在该堆栈上。但是当foo向调用者返回一些数据,并且调用者决定对其执行某些操作时,即使bar无处可能,{@ 1}}也可能出现在调用堆栈上可见

简而言之,调用堆栈中的内容顺序与谁调用谁无关。这取决于谁在看什么。