Skip to content

元 / Arity

是什么

Arity 指的是函数所需的参数的个数

为什么

一元纯函数可以很方便的和其他模块的函数组合。

只要一个函数的输出和另一个函数的输入兼容,那么这两个函数就可以组合在一起,一个以上的函数可以组合在一起成为一个函数链,以完成某个特定的功能。

并且后续修改逻辑仅仅需要从这条函数组合链中,移除或者增加函数节点。

举例

比如你有一个需求:修正金额字符串

我们编写了多个纯函数:

  1. removeDot(str) -> str 移除多余的小数点
  2. checkMax(str) -> str 如果超出了最大金额 10000,则修正为最大金额 10000
  3. checkMin(str) -> str 如果超出了最小金额 0,则修正为最小金额 0

那么这个函数可以定义为 R.compose(checkMax, checkMin, removeDot)

上述从右往左依次执行,先执行的函数的输出是后一个的输入,如果不需要某一个功能,可以安全、便捷从链中移除,增加功能也是同理。

不仅增删逻辑变得容易,而且函数的输出具有可预测性,易于测试。

一元纯函数

函数式编程推荐我们将一个复杂的任务分解成简单的小任务,最佳做法是将这些小任务都变成一元纯函数,即仅接收一个参数的纯函数。

借助柯里化

函数式编程鼓励使用一元纯函数并不意味着,我们定义函数时都只声明一个参数。

currying 可以减少和复用函数的参数,利用它可以将一个多元函数转换为一个一元纯函数。

减参 / 降元

javascript
import _ from 'lodash'
const checkMax = _.curry((max, str) => (str) => str > max ? max : str)
const checkTen = checkMax(10)

参数复用

javascript
const adder = (a) => (b) => a + b;
const addOne = adder(1)
console.log(addOne(2)) // -> 1 + 2 = 3