Skip to content

组合

│ 函数组合进阶 │ Point-Free 风格、compose/pipeline、组合定律 │ composition.md │ ├──────────────┼─────────────────────────────────────────────┼────────────────┤ │ Lens/Optics │ 深度不可变更新、getter/setter 组合 │ lens.md │ ├──────────────┼─────────────────────────────────────────────┼────────────────┤ │ Transducer │ 高性能数据转换、map/filter/fuse 融合 │ transducer.md │

纯函数和函数组合

函数组合是指将多个函数组合成一个函数,从而获得更复杂的功能。语言支持高阶函数是实现组合的前提。函数组合是函数式编程中的核心概念,组合可以对多个函数进行创建、增强、pipe、柯里化等,将多个简单的函数组合成一个更大的函数,从而实现更复杂的逻辑。

组合往往是针对于纯函数而言的,对于脏函数而言,组合的意义被大大削减,因为脏函数的副作用会限制其通用性。

函数组合的概念区分于面向对象中的组合。面向对象中的组合是指一个类实现了多个原子化的接口,从而组合了多种能力,以达到程序的复用性。同时,解决了多继承的菱形继承问题和普通继承的代码粒度问题。

高阶函数

高阶函数是指至少满足以下条件之一的函数:接受一个或多个函数作为参数,或返回一个函数。在支持高阶函数的语言中,函数可以作为一等公民,从而实现函数的抽象、复用、组合等操作,使函数式编程具有更高的抽象层次和更强的表达能力。

多元函数

函数根据参数个数可以分成一元函数、高阶一元函数、二元函数、高阶二元函数等不同类型。在函数式编程中,一元函数具有特殊地位,我们可以简单地将一个参数的结果传入另一个函数中,依次调用形成类似流水线的结构,让程序逻辑变得有条理。这是纯函数的重要表现形式,纯函数往往被看作透明的管道,只对传入的数据做加工处理,简单而清晰地呈现数据流,是最为理想和纯粹的函数式编程模型。

二元函数具有可利用的特殊性质,固定一个参数位后就变成了一元函数,可以看作具有一个额外依赖的一元函数。绑定依赖后,二元函数可以转变为一元函数,主要通过两种方式实现:面向对象的方法调用语法.,以及闭包和柯里化来指定参数并延迟调用。组合或管道的写法可以由链式调用或使用高阶多元函数compose或pipeline来完成,compose从右往左调用,pipeline从左往右调用。