Appearance
元 / Arity
是什么
Arity 指的是函数所需的参数的个数
为什么
一元纯函数可以很方便的和其他模块的函数组合。
只要一个函数的输出和另一个函数的输入兼容,那么这两个函数就可以组合在一起,一个以上的函数可以组合在一起成为一个函数链,以完成某个特定的功能。
并且后续修改逻辑仅仅需要从这条函数组合链中,移除或者增加函数节点。
举例
比如你有一个需求:修正金额字符串
我们编写了多个纯函数:
removeDot(str) -> str
移除多余的小数点checkMax(str) -> str
如果超出了最大金额10000
,则修正为最大金额10000
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