什么是组合子(combination)??
根据SO(程序员问答社区)的定义,它是"一个没有自由变量的函数或定义"吗?
还是按照John Hughes在他关于Arrows的著名论文中的说法:"组合子(combinator)是从程序片段中构建程序片段的函数",这样做有利于"...使用组合子编程者可以自动地构建大部分所需的程序,而不是手写每个细节。" 他接着说,map
和filter
是这种组合子的两个常见例子。
一些符合第一种定义的组合子:
- S
- K
- Y
- 来自To Mock a Mockingbird的其它组合子(我可能错了——我没有读过这本书)
一些符合第二种定义的组合子:
- map
- filter
- fold/reduce (推测)
- 任意的 >>=, compose, fmap ?????
我对第一种定义不感兴趣——它们不能帮助我编写实际的程序(如果你能说服我并证明我错了,我会给你+1分)。请帮我理解第二种定义。 我认为map、filter和reduce很有用:它们使我能够以更高的层次进行编程——减少错误、代码更简洁。以下是我关于组合子的一些具体问题:
- 还有哪些类似于map、filter这样的组合子示例?
- 编程语言通常会实现哪些组合子?
- 组合子如何帮助我设计更好的API?
- 如何设计有效的组合子?
- 在非函数式语言(比如Java)中,与组合子相似的东西是什么,或者这些语言使用什么来代替组合子?
更新
感谢@C. A. McCann,我现在对组合子有了一个稍微更好的理解。但是还有一个问题让我困扰:
使用组合子编写的函数式程序与不使用组合子编写的函数式程序之间有什么区别?
我猜测使用组合子编写的版本会更短、更清晰、更通用,但如果可能的话,我很想听听更深入的讨论。
同时我也在寻找常见编程语言中更复杂的组合子(比如fold
更为复杂的组合子)的更多示例和解释。