为什么在一个数据结构上使用100个函数比在10个数据结构上使用10个函数要好

我在很多地方都看到过这句话:

“在一个数据结构上运行100个函数比在10个数据结构上运行10个函数要好。”ー艾伦佩利斯

但我从来没有看到它解释为什么这应该是真的。您是否只是认为应该尝试从第一个数据结构派生其他9个数据结构,以避免重复数据?我觉得我漏掉了一些上下文。

8500 次浏览

这段话摘自艾伦 · 珀利斯1982年出版的 关于编程的警句

这句话的意思在 口齿不清中得到了很好的体现,口齿不清中有大量的函数专门用来操作和处理 清单,仅仅使用列表和在列表上操作的各种函数就可以完成很多工作,这使得它们比任何单一用途的数据结构都要强大得多。

Lua ,作为另一个例子,使用表来模拟类。为什么要使用表来创建对象,而不是像面向对象语言那样创建语言级类和对象呢?由于您的对象现在是一个表,因此您可以免费使用为对象上的表定义的任意数量的函数!更好的是,我们不必使用特定于类的语法来混乱语言,也不必为我们的类从表中重新定义函数。

Perlis 所说的绝对是 Lisp 和 函数式程序设计中一个突出的思维模式。你的一个数据结构上的那100个函数可以以很多独特的方式组合在一起,因为它们都在同一个数据结构上运行,但是你不能真的把10个函数混合在10个数据结构上,因为它们只能在特定的数据结构上运行。

一个更现代和更简单的变化是根据 抽象概念思考。如果我们用 Java 编写代码,你是愿意在 名单接口上编写100个函数,还是同样的10个函数,一次用于 ArrayList,一次用于 LinkedList,一次用于..。

计算机程序的构造和解释回答你的问题如下:

Screenshot from SICP

您可以看到 这本书的在线版本在这里的原始内容

编辑(从评论中包括) :

“在 Pascal 中,过多的可声明数据结构导致函数的专门化。”专业化是不好的,因为它会用我自己的话来抑制“意外发现”/创造力。

换句话说,如果函数过于特殊,那么它们就不能以创建函数时不知道的方式重用。

很好的例子是 fold(https://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Foldable.html) ,它是一个数据结构不可知的、通用的高阶函数。例如,它可以用在树上

data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a).