【问题标题】:Why Erlang functions are not memoized by default?为什么 Erlang 函数默认不被记忆?
【发布时间】:2013-08-15 07:56:36
【问题描述】:

functional languages 的特性之一是函数没有副作用,因此相同的输入应该总是产生相同的输出。似乎这些语言可以很容易地从memoization 中受益匪浅。

但是,至少对于Erlang,函数调用没有默认记忆。 Erlang(以及据我所知的其他函数式语言)在默认情况下(或使用简单的触发器)会做 memoize,或者至少对 memoization 有明确、良好的支持,有什么特别的原因吗?

记忆化有什么本质上的问题吗?

我可以想象的一个原因是,通过记忆化,您的内存占用会迅速增长。没错,但是 Erlang 已经在 VM 上运行并管理内存,所以我想它可以驯服缓存并防止它们很容易增长。

相关

编辑

【问题讨论】:

  • Erlang 不是没有副作用的。例如,我可以编写一个函数来打开一个日志文件并从它的末尾返回请求的字节数。使用相同的参数调用两次,此函数可能会返回两个不同的值。或者考虑random:uniform,它的返回值不能被缓存。
  • 当然,我们不是生活在没有规模效应的乌托邦中。尽管如此,没有副作用是 FP 的基石
  • 不要将副作用与幂等性混淆。 “相同输入的多次执行总是产生相同的输出”是幂等性的定义,副作用显然不会影响输出
  • too_big_to_fail 标志当然不应该被认真对待......愚人节;)
  • 天哪,他们抓住了我。有人告诉摩托罗拉和爱立信吗? :)

标签: functional-programming erlang memoization


【解决方案1】:

这个问题有很多错误的假设。

函数式语言的特性之一是函数没有副作用

不正确,只有“纯函数式语言”有这样的约束。 Erlang 不是纯粹的函数式。 它允许函数中的任意副作用。

Erlang(以及据我所知的其他函数式语言)在默认情况下(或使用简单的触发器)会做 memoize,或者至少有明确的、良好的 memoization 支持,有什么特别的原因吗?

没有语言(至少非玩具语言)默认实现所有函数调用的记忆。为什么?随之而来的是大量空间泄漏。

【讨论】:

  • 我很确定他的意思是“默认情况下不要记忆”
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 2016-04-22
  • 2020-06-09
  • 2021-04-07
  • 2016-01-18
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多