【发布时间】:2013-08-15 07:56:36
【问题描述】:
functional languages 的特性之一是函数没有副作用,因此相同的输入应该总是产生相同的输出。似乎这些语言可以很容易地从memoization 中受益匪浅。
但是,至少对于Erlang,函数调用没有默认记忆。 Erlang(以及据我所知的其他函数式语言)在默认情况下(或使用简单的触发器)会做 memoize,或者至少对 memoization 有明确、良好的支持,有什么特别的原因吗?
记忆化有什么本质上的问题吗?
我可以想象的一个原因是,通过记忆化,您的内存占用会迅速增长。没错,但是 Erlang 已经在 VM 上运行并管理内存,所以我想它可以驯服缓存并防止它们很容易增长。
相关:
- Memoization in Erlang
- How does one use cached data in a functional language such as Erlang?
- Simple example for Erlang memoization
编辑:
【问题讨论】:
-
Erlang 不是没有副作用的。例如,我可以编写一个函数来打开一个日志文件并从它的末尾返回请求的字节数。使用相同的参数调用两次,此函数可能会返回两个不同的值。或者考虑random:uniform,它的返回值不能被缓存。
-
当然,我们不是生活在没有规模效应的乌托邦中。尽管如此,没有副作用是 FP 的基石
-
不要将副作用与幂等性混淆。 “相同输入的多次执行总是产生相同的输出”是幂等性的定义,副作用显然不会影响输出
-
too_big_to_fail标志当然不应该被认真对待......愚人节;) -
天哪,他们抓住了我。有人告诉摩托罗拉和爱立信吗? :)
标签: functional-programming erlang memoization