我有一个内部状态,必须不断更新。在函数式编程之后,状态是不可变的,循环是使用递归实现的。这是如何以假设的(基于C语言)实现的一种示例方式:
void RunUpdateLoop(WorldState world)
{
WorldState newWorld = Update(world);
RunUpdateLoop(newWorld);
}
但是,这很快就会导致堆栈溢出(假设尾递归优化不会发生)。如何以功能的方式实现这一点而不会导致堆栈溢出?
答案 0 :(得分:0)
如果存在尾递归优化,则生成的代码与
类似void RunUpdateLoop(WorldState world) {
while(1) { world = RunUpdateLoop(world); }
}
没有
当然你可以说它不够“功能”,但你要求用程序语言提供“功能性”解决方案。所以,不太清楚你在追求什么。
您总是可以使用类似堆栈的数据结构模拟堆中的调用堆栈,并自行执行尾递归优化,但在这种情况下,它将再次崩溃到与上面非常类似的东西。