柯里化概念
柯里化是把一个多参数函数转换成一个嵌套的一元函数的过程;当函数有多个参数时先传递一部分参数调用(这部分参数永远不变),然后返回新的函数接收剩余的参数
// 改造上面的例子
let checkAge = (MinimumAge) => (age) => age >= MinimumAge
let checkAge18 = checkAge(18)
let checkAge20 = checkAge(20)
checkAge18(24)
checkAge20(19)
// 二元参数柯里化
let fn = (x, y) => x + y
const curry = (fn) => (x) => (y) => fn(x, y)
let myfn = curry(fn)
console.log(myfn(1)(2))
lodash
中的柯里化函数
-
_.curry(func)
- 功能:创建一个函数,函数接收一个或多个
func
的参数,如果func
所需参数都被提供则执行func
并返回执行结果,否则继续返回该函数并等待被接收剩余的参数。 - 参数:需要被柯里化的函数
- 返回值:柯里化后的函数
const _ = require('lodash') const getSalary = (salary, allowance, workTime) => salary + allowance * workTime const curriedSalary = _.curry(getSalary) console.log(curriedSalary(10000)(1000, 10)) console.log(curriedSalary(10000, 20)(1500))
- 功能:创建一个函数,函数接收一个或多个
-
案例
const _ = require('lodash') const match = _.curry((reg, str) => str.match(reg)) const havaNumber = match(/\d+/g) const havaSpave = match(/\s+/g) console.log(haveSpace('hello world')) console.log(haveNumber('fds234')) const filter = _.curry((func, arr) => arr.filter(func)) console.log(filter(havaSpace, ['hi, chenjiao', 'hello'])) const findSpace = filter(havaSpace) console.log(findSpace(['hi, chenjiao', 'hello']))
-
模拟
lodash
中_.curry
函数// 多元参数柯里化 模拟实现 lodash 中的 curry 方法 function curry(fn) { return function curriedFn(...args) { // 判断实参和形参的个数 if (args.length < fn.length) { return function () { return curriedFn(...args.concat(...arguments)) } } return fn(...args) } } const fn = (x, y, z) => x + y + z const myfn = curry(fn) console.log(myfn(1)(2)(3))
总结
- 柯里化可以一个函数传递较少的参数得到一个已经记住某些固定参数的新函数
- “缓存”函数参数
- 让函数变得灵活,让函数粒度更小
- 可以将多元函数转换为一元函数,组合解决更复杂的函数
网友评论