【问题标题】:How to implement an infinite update loop in a functional way如何以功能方式实现无限更新循环
【发布时间】: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


【解决方案1】:

如果有尾递归优化,生成的代码将非常类似于类似

void RunUpdateLoop(WorldState world) {
    while(1) { world = RunUpdateLoop(world); }
}

没有?

当然,您可以说这还不够“功能性”,但您要求的是程序语言中的“功能性”解决方案。所以,不太清楚你在追求什么。

你总是可以用类似栈的数据结构来模拟堆中的调用栈,然后自己做尾递归优化,但在这种情况下,它会再次崩溃成与上面非常相似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2013-08-03
    • 2019-03-15
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多