【发布时间】:2014-09-08 02:46:00
【问题描述】:
我有一个内部状态,它必须不断更新。在函数式编程之后,状态是不可变的,循环是使用递归实现的。那么如何在假设的(基于 C 的)语言中实现这一点的一个示例方法是:
void RunUpdateLoop(WorldState world)
{
WorldState newWorld = Update(world);
RunUpdateLoop(newWorld);
}
但是,这会很快导致堆栈溢出(假设没有发生尾递归优化)。如何在不导致堆栈溢出的情况下以功能方式实现这一点?
【问题讨论】:
-
如果您想在其中进行函数式编程,为什么不在假设语言中进行尾调用优化?这几乎是纯函数式编程的要求,因为您需要(在某种程度上)进行递归以进行循环。
-
一个问题是,例如在 C++ 中,尾调用优化可能在调试编译目标中被禁用(以及一堆其他优化)。
-
嗯,我不建议严格地坚持使用 C++ 中的纯函数式编程。这种事情尤其不适合 C++(没有递归循环使它变得困难)。不要误会我的意思,我喜欢函数式编程(事实上,到目前为止,我在这里的大部分活动都与 FP 相关),但最好使用你正在使用的语言而不是尝试使用没有得到很好支持的样式(并不是说 C++ 对 FP 没有一些支持,只是这个特定问题是它在 C++ 中确实不能很好工作的领域)。
标签: recursion functional-programming infinite-loop