为什么Erlang函数默认情况下不进行记忆化?

3

函数式语言的一个特性是函数没有副作用,因此相同的输入应该始终产生相同的输出。看起来这些语言可以很容易地从记忆化中受益。

但是,至少就Erlang而言,函数调用没有默认的记忆化。是否有任何特定的原因使Erlang(以及我所知道的其他函数式语言)默认情况下进行记忆化(或通过简单的触发器),或者至少具有显式的良好的记忆化支持?

记忆化本身是否存在问题?

我能想象的一个原因是,使用记忆化会使内存占用快速增长。没错,但是Erlang已经在VM上运行并管理内存,因此我想它可以轻松控制缓存并防止其快速增长。

相关:

编辑:


5
Erlang不是无副作用的语言。例如,我可以编写一个函数,它打开一个日志文件并返回文件末尾请求的字节数。如果使用相同的参数两次调用此函数,它可能会返回两个不同的值。再比如,考虑random:uniform函数,其返回值不能被缓存。 - Chris
当然,我们并不生活在没有大小副作用的乌托邦中。然而,缺乏副作用是FP的基石。 - Jakub M.
1
不要将副作用与幂等性混淆。"相同输入的多次执行始终产生相同的输出"是幂等性的定义,而副作用显然不会影响输出。 - user
3
“太大而无法失败”标志当然不应该被认真对待……愚人节;) - johlo
1
圣字节,他们抓住我了。有人告诉摩托罗拉和爱立信了吗? :) - Jakub M.
有没有一些数据表明人们对此感兴趣。我的第一感觉是,这需要巨大的设计工作才能产生微小的效果。但这只是我的感觉,我很想知道是否有任何关于实际应用的研究。 - Pascal
1个回答

5
这个问题中存在一些错误的假设。
其中之一是函数式语言的一个特点是函数没有副作用。
这是不正确的,只有“纯函数式语言”才有这样的限制。Erlang不是纯函数式语言。 它允许在函数中使用任意的副作用。
问:有没有什么特别的原因,Erlang(以及我所知道的其他函数式语言)默认情况下是否使用记忆化(或者简单的触发器),或者至少明确地支持记忆化?
答:没有语言(至少非玩具语言)会实现默认记忆化所有函数调用。为什么?会导致大量空间泄漏。

我非常确定他的意思是“不要默认使用记忆化”。 - lud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接