为什么在一个数据结构上有100个函数比10个数据结构上的10个函数更好呢?

我在很多地方看到过这个引用:

“在一个数据结构上运行100个函数比在10个数据结构上运行10个函数要好”。 – 阿兰玻璃市

但我从来没有见过这解释为什么这应该是真实的。 是不是应该尝试从第一个数据结构中导出其他数据结构以避免重复数据? 我觉得我错过了一些上下文。

引用来自Alan Perlis的1982年出版的“ Programming on Programming” 。

这个引用的含义在Lisp中得到了很好的体现, Lisp有许多function可以操作和专门处理列表 ,而且你可以用列表和列表上的各种函数完成很多工作,这使得它们更加强大比任何单一用途的数据结构。

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

Perlis所说的绝对是Lisp和函数式编程的一个突出的思想模式。 在你的一个数据结构中,这100个函数可以用许多独特的方式组合在一起,因为它们都在相同的数据结构上运行,但是你也不能真正在10个数据结构上混合这10个函数,因为它们只是被定义的来处理他们特定的数据结构。

一个更现代和更简单的变化就是抽象思维。 如果我们使用Java进行编码,那么您宁愿在List接口上写入100个函数,还是在同一组函数中写入100个函数,一次为ArrayList,一次为LinkedList,一次为….

计算机程序的结构和解释(SICP)回答你的问题如下:

从SICP截图

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

编辑(包括从评论):

“在Pascal中,大量可申报的数据结构导致了function内部的专业化。” 专业化是不好的,因为它用我自己的话来抑制“意外情绪”/创造力 – 我会说。

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

很好的例子是foldhttps://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).