Y-combinator似乎没有任何效果
Y-combinator does not seem to have any effect
我尝试使用 y 组合器(在 Lua 和 Clojure 中),因为我认为这会允许我在使用递归时超过默认堆栈实现的大小。看来我弄错了。是的,它有效,但在这两个系统中,堆栈在与使用普通旧递归时完全相同的点发生爆炸。 Clojure 中的低~3600 和我的 Android Lua 实现中的高~333000。它也比常规递归慢一点。
那么使用 y 组合器有什么好处,还是只是一种证明观点的智力练习?我错过了什么吗?
===
PS。抱歉,我应该更清楚地说明我知道我可以使用 TCO 来超出堆栈。我的问题与此无关。我对此很感兴趣
a) 从academic/intellectual的角度来看
b) 对于那些不能 尾递归写的函数,是否有什么可以做的。
“尾调用”将允许您超出任何筹码量限制。见 Programming in Lua, section 6.3: Proper Tail Calls:
...after the tail call, the program does not need to keep any information about the calling function in the stack. Some language implementations, such as the Lua interpreter, take advantage of this fact and actually do not use any extra stack space when doing a tail call. We say that those implementations support proper tail calls.
Y 组合器允许递归使用非递归函数,但该递归仍会通过嵌套函数调用消耗堆栈 space。
对于不能尾递归的函数,您可以尝试使用连续传递样式重构它们,这将消耗堆 space 而不是堆栈。
这里有一个很好的主题概述:https://www.cs.cmu.edu/~15150/previous-semesters/2012-spring/resources/lectures/11.pdf
如果你还没有看过,这里有一个很好的解释:What is a Y-combinator?
综上所述,它有助于证明 lambda 演算是图灵完备的,但对正常的编程任务无用。
您可能已经知道,在 Clojure 中,您只需使用 loop
/recur
到 implement a loop 即可,不会消耗堆栈。
我尝试使用 y 组合器(在 Lua 和 Clojure 中),因为我认为这会允许我在使用递归时超过默认堆栈实现的大小。看来我弄错了。是的,它有效,但在这两个系统中,堆栈在与使用普通旧递归时完全相同的点发生爆炸。 Clojure 中的低~3600 和我的 Android Lua 实现中的高~333000。它也比常规递归慢一点。
那么使用 y 组合器有什么好处,还是只是一种证明观点的智力练习?我错过了什么吗?
===
PS。抱歉,我应该更清楚地说明我知道我可以使用 TCO 来超出堆栈。我的问题与此无关。我对此很感兴趣 a) 从academic/intellectual的角度来看 b) 对于那些不能 尾递归写的函数,是否有什么可以做的。
“尾调用”将允许您超出任何筹码量限制。见 Programming in Lua, section 6.3: Proper Tail Calls:
...after the tail call, the program does not need to keep any information about the calling function in the stack. Some language implementations, such as the Lua interpreter, take advantage of this fact and actually do not use any extra stack space when doing a tail call. We say that those implementations support proper tail calls.
Y 组合器允许递归使用非递归函数,但该递归仍会通过嵌套函数调用消耗堆栈 space。
对于不能尾递归的函数,您可以尝试使用连续传递样式重构它们,这将消耗堆 space 而不是堆栈。
这里有一个很好的主题概述:https://www.cs.cmu.edu/~15150/previous-semesters/2012-spring/resources/lectures/11.pdf
如果你还没有看过,这里有一个很好的解释:What is a Y-combinator?
综上所述,它有助于证明 lambda 演算是图灵完备的,但对正常的编程任务无用。
您可能已经知道,在 Clojure 中,您只需使用 loop
/recur
到 implement a loop 即可,不会消耗堆栈。