Haskell(GHC)运行时如何知道在评估thunk之后应该执行哪些代码?
在概念层面上,与其他编程语言中的调用堆栈有什么不同(除了在堆上存储闭合变量并具有尾递归)?
答案 0 :(得分:2)
GHC(或者更确切地说,GHC RTS)具有正常的调用堆栈,就像大多数事情一样。
这个堆栈的内容有什么不同。它与您的预期不符。
假设函数foo
调用函数bar
,它调用函数baz
。您可能期望调用堆栈看起来像
foo
bar
baz
在某个时候。但实际上,当foo
调用bar
时,所有“调用”确实会创建一个thunk并立即返回。因此,bar
在该点上不会出现在该堆栈上。但是当foo
向调用者返回一些数据,并且调用者决定对其执行某些操作时,即使bar
无处可能,{@ 1}}也可能出现在调用堆栈上可见
简而言之,调用堆栈中的内容顺序与谁调用谁无关。这取决于谁在看什么。