柯里化理解与案例

柯里化理解与案例,第1张

1.柯里化的概念

柯里化也是属于函数式编程里面非常重要的概念;

一种关于函数的高阶技术;不仅用在JavaScript,还用在其他编程语言。

维基百科的解释:

在计算机科学中,柯里化(currying)是把接收的多个参数的函数,变成接收一个单一函数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术;柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”;

总结:

只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数;这个过程就称之为柯里化。

柯里化是一种函数的转换,将一个函数从可调用的f(a, b, c)转换为可调用的f(a)(b)(c),柯里化不会调用函数,它只是对函数进行转换

2.柯里化的代码转换
//没有进行柯里化的函数
function add1(x, y, z) {
    return x + y + z
}

console.log(add1(10, 20, 30))

//柯里化处理的函数
function add2(x) {
    return function(y) {
        return function(z) {
            return x + y + z
        }
    }
}

console.log(add2(10)(20)(30))

也可以使用箭头函数让代码更加简洁

var add3 = x => y => z =>{
    return x + y + z
}

console.log(add3(10)(20)(30))
3.柯里化的优势

柯里化优势一:函数的职责单一

在函数式编程中,我们其实往往希望一个函数处理的问题尽可能的单一,而不是将一大堆的处理过程交给一个函数来处理;

那么我们是否就可以将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果;

function add2(x) {
    x = x + 2
    return function(y) {
        y = y * 2
        return function(z) {
            z = z ** 2
            return x + y + z
        }
    }
}

传入的参数分别处理

第一个参数 + 2第二个参数 * 2第三个参数 ** 2

柯里化优势二:函数的参数复用

 function makeAdder(num) {
        return function (count) {
          return num + count
        }
      }
      var add5 = makeAdder(5)
      add5(12)
      add5(100)
      
      var add10 = makeAdder(10)
      add10(12)
      add10(100)

makeAdder函数要求我们传入一个num,在之后使用返回的函数时,我们不需要再继续传入num了

4.柯里化案例练习

 案例需要打印一些日志问题,包括时间、类型、信息;

function log(data, type, message) {
          console.log(`[${date.getHours()}:${date.getMinutes()}] [${type}] [${message}]`)
      }
      log(new Date(), "DEBUG", "修复问题")
      log(new Date(), "FEATURE", "新功能")

虽然可以实现,但是每次编写都需要复用许多代码,所以将其柯里化。

var log= data => type =>  message => {
          console.log(`[${date.getHours()}:${date.getMinutes()}] [${type}] [${message}]`)
      }
      var logNow = log(new Date())
      logNow("DEBUG")("轮播图bug")
      logNow("DEBUG")("点击无效bug")

      var logNowDebug = log(new Date())("DEBUG")
      logNoewDebug("轮播图bug")
      logNoewDebug("点解无效bug")

使用了箭头函数,简洁了一些,并且复用了许多代码。

5.柯里化高级-自动柯里化函数

需要编写一个可以自动柯里化的函数 

function Currying(fn) {
    function curried(...args){
    if(args.length >= fn.length){
            return fn.apply(this, args)
        }else {
                return function (...args2){
                    return curried.apply(this, args.concat(args2))
                }
            }
    }
    return curried
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1324223.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存