我在很多地方都看到过这个引用:
“在一个数据结构上运行 100 个函数比在 10 个数据结构上运行 10 个函数要好。” ——艾伦·佩利斯
但我从未见过它解释了为什么这应该是真的。是否只是您应该尝试从第一个数据结构派生其他 9 个数据结构以避免重复数据的想法?我觉得我错过了一些背景。
我在很多地方都看到过这个引用:
“在一个数据结构上运行 100 个函数比在 10 个数据结构上运行 10 个函数要好。” ——艾伦·佩利斯
但我从未见过它解释了为什么这应该是真的。是否只是您应该尝试从第一个数据结构派生其他 9 个数据结构以避免重复数据的想法?我觉得我错过了一些背景。
这句话出自 Alan Perlis于 1982 年出版的编程警句。
这句话的意思在Lisp中得到了很好的体现,其中有许多专门操作和处理列表的函数,你可以通过列表和对列表进行操作的各种函数来完成很多事情,这使得它们更加强大比任何单一用途的数据结构。
作为另一个例子,Lua使用表来模拟类。为什么要使用表来制作对象,而不是像面向对象的语言那样创建语言级别的类和对象?由于您的对象现在是一个表格,您可以免费使用为您的对象上的表格定义的任意数量的函数!更好的是,我们不必用特定于类的语法来混淆语言,也不必从表中重新定义我们想要用于我们的类的函数。
Perlis 所说的绝对是 Lisp 和一般函数式编程中一种突出的思维模式。一个数据结构上的这 100 个函数可以以许多独特的方式组合在一起,因为它们都在同一个数据结构上运行,但是你不能真正混合 10 个数据结构上的 10 个函数,因为它们只是被定义的处理他们特定的数据结构。
一个更现代和更简单的变体是从抽象的角度思考。如果我们用 Java 编写代码,你宁愿在List接口上编写 100 个函数,还是同组的 10 个函数,一次用于 ArrayList,一次用于 LinkedList,一次用于...。
计算机程序的结构和解释(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).