functional-programming - 如何以功能方式实现 'state-driven' 程序?

标签 functional-programming racket immutability

我打算用 Racket 语言编写一个电路模拟器。
为此,我必须以任何形式保存整个电路的初始电气状态(如果是 Racket,则为列表),并在函数中重复传递该值,直到电路状态进入给定时间。

但是,重复将数据传递给函数,会不会在堆栈中增长并最终影响程序的性能?
我听说在递归函数的情况下,在编译时代码首先扩展到递归完成的最后阶段,然后从嵌套最深的一个开始,一次对一个进行求值。
如果同样适用于这种情况(不仅是我的,而且在任何包含状态机的程序中),我是否应该依赖该语言勉强提供的可变数据结构?

在阅读了一堆赞扬 FP 的文章后,我也想做出改变。回首那些日子,当我疯狂地喝着可变状态的 kool-aids 来处理这些案件时,我现在觉得自己像个罪犯。
如果问题是另一个重复的或类似的问题,请给我一个链接,我会很高兴地接受它并关闭这个问题(或者我可以吗?)。

最佳答案

如果你的模拟器的“主循环”允许tail call elimination ,“堆栈”不会无休止地增长。本质上,函数调用不需要将参数“压入”“堆栈”;相反,您跳转到函数的开头,重复使用参数。

尝试在此处搜索 [racket] tail recursion[racket] tail call找到(或没有)尾部位置的例子。

关于functional-programming - 如何以功能方式实现 'state-driven' 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164084/

相关文章:

python - 从字典中过滤项目并处理子集

functional-programming - 编译错误 : "definitions with multiple clauses and default values require a function head"

algorithm - 是否可以编写通用算法来使用 Zippers 更新嵌套(无论嵌套如何)数据结构中的元素?

方案:列表计数器

java - 为什么内在锁对象不需要特殊处理(static、final、volatile)?

inheritance - 如何在@Immutable 类中设置父类(super class)属性?

scala - 在 Scala 中使用累加器映射列表的功能方法

lisp - Scheme (Lazy Racket) 自然数的无限列表

loops - Racket 中的 While 循环

immutability - Kotlin 中带有 val 的循环引用