柯里化

作者: 翔子丶 | 来源:发表于2021-01-01 18:27 被阅读0次
柯里化概念

柯里化是把一个多参数函数转换成一个嵌套的一元函数的过程;当函数有多个参数时先传递一部分参数调用(这部分参数永远不变),然后返回新的函数接收剩余的参数

// 改造上面的例子
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))
    
总结
  • 柯里化可以一个函数传递较少的参数得到一个已经记住某些固定参数的新函数
  • “缓存”函数参数
  • 让函数变得灵活,让函数粒度更小
  • 可以将多元函数转换为一元函数,组合解决更复杂的函数

相关文章

  • 手写简单.bind()实现

    手写一个实现柯里化的.bind() 柯里化:《函数柯里化小结》柯里化:前端开发者进阶之函数柯里化Currying ...

  • 函数式编程(三)—— 柯里化

    柯里化Lodash中的柯里化 —— curry()案例柯里化原理模拟柯里化总结 【函数式编程总体设计】 之前讲了函...

  • [译]JavaScript中的函数柯里化

    原文 Currying in JS 函数柯里化 函数柯里化以Haskell Brooks Curry命名,柯里化是...

  • 简单理解JavaScript中的柯里化和反柯里化

    简单理解JavaScript中的柯里化和反柯里化 前言 本文旨在让大家简单理解柯里化和反柯里化,这里不做深入探究,...

  • 简单理解JavaScript中的柯里化和反柯里化

    简单理解JavaScript中的柯里化和反柯里化 前言 本文旨在让大家简单理解柯里化和反柯里化,这里不做深入探究,...

  • js柯里化

    标签: js柯里化 js柯里化 柯里化是什么在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成...

  • 柯里化和反柯里化

    一、柯里化 定义函数柯里化就是把一个函数中的一些可以固定的参数固定后生成新的函数比如一个函数: 现在有一个需求:就...

  • swift 柯里化

    swift 柯里化 柯里化 1、什么是柯里化? 柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一...

  • JS函数式编程之柯里化

    JS函数式编程之柯里化 为什么要了解柯里化 柯里化是函数式编程必须要使用的. 这里我们就先介绍下什么是柯里化, 然...

  • 柯里化

    f(x)和g(x)合成为f(g(x)),有一个隐藏的前提,就是f和g都只能接受一个参数。 如果可以接受多个参数,比...

网友评论

    本文标题:柯里化

    本文链接:https://www.haomeiwen.com/subject/aybjoktx.html