前端学习之函数式编程—柯里化

Posted 萌萌的DDD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端学习之函数式编程—柯里化相关的知识,希望对你有一定的参考价值。

part 01 -- 柯里化概念

柯里化是为了解决函数中不纯函数或函数硬编码的问题

什么是硬编码

function getAge(age) {
    let min = 18
    return age > min
}

 函数式编程是保证相同的调用总能得到相同的结果,但当相同的调用有可能不能得到相同的结果时则称之为硬编码。

//函数的柯里化
function checkAge(min) {
    return function(age) {
        return age > min
    }
}

let baseAge = 18

const age18 = checkAge(18)
const age24 = checkAge(24)

console.log(age18(20));  //false
console.log(age24(20));  //true


ES6 // let checkAge = (min) => { age => age >= min }

柯里化的作用:当函数中有多个参数的时候,我们可以对这个函数进行改造

                         通过闭包的形式,调用这个函数,只传递部分的参数,并且将一个新的函数作为返回值,新的函数用来接收并且返回相应的结果,则称为柯里化。


Part 02 -- 通用的柯里化解决方案 --- lodash.curry

  • 功能:创建一个函数,该函数接受一个或多个func的参数,如果func所需要的参数都被提供则执行func并返回执行的结果。否则既需返回该函数并等待接受剩余的参数。
  • 参数:需要柯里化函数
  • 返回值:柯里化后的函数
  • 作用:将多元,多参数的函数,最终转化成一元的函数
const _ = require('lodash')

function getSum(a, b, c) {
    return a + b + c
}
const curry = _.curry(getSum)
    // 传递三个参数
console.log(curry(1, 2, 5)); // 8

// 也可以将前两个参数保存起来
const cur1 = curry(1, 2)
    // 传入第三个参数,依然可以获得相同结果
console.log(cur1(5)); // 8

Part 03 -- 柯里化案例

const _ = require('lodash')
const match = _.curry(function(reg, str) {
    return str.match(reg)
})
const haveSpace = match(/\\s+/g)
const haveNumber = match(/\\d+/g)

console.log(haveSpace('hello World')); // [' ']
console.log(haveNumber('abc')); // null

Part 04 -- 柯里化原理模拟

function curry(func) {
    return function curriedFn(...args) {
        // 判断实参和形参的个数
        if (args.length < func.length) {
            return function() {
                return curriedFn(args.concat(Array.from(arguments)))
            }
        }
        return func(...args)
    }
}

Part 05 -- 柯里化总结

  • 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新韩式
  • 这是一种对于函数的’缓存‘
  • 让函数变得更灵活,让函数颗粒度更小
  • 可以把多元函数转换成一元函数,可以组合使用函数产生的强大的功能

以上是关于前端学习之函数式编程—柯里化的主要内容,如果未能解决你的问题,请参考以下文章

前端必学——函数式编程

前端学习之函数式编程—函数式编程概念+头等函数

编程范式函数式基础图示

函数式编程:纯函数&柯里化&组合函数

函数式编程———柯里化(Currying)

前端学习之函数式编程—闭包