JS中的柯里化及精巧的自动柯里化实现

什么是柯里柯里化?

在计算机科学中,柯里化(Currying)是化及把接受多个参数的函数变换成接受一个单一参数(最初函数的***个参数)的函数,并且返回接受余下的精巧参数且返回结果的新函数的技术。这个技术由 Christopher Strachey以逻辑学家 Haskell Curry命名的自动柯,尽管它是实现 Moses SchnfinkelGottlob Frege发明的。

理论看着头大?柯里没关系,先看看代码:

柯里化应用

假设我们需要实现一个对列表元素进行某种处理的化及功能,比如说让列表内每一个元素加一,精巧那么很容易想到:

const list = [0,自动柯 1, 2, 3]; list.map(elem => elem + 1); 

很简单是吧?如果又要加2呢?

const list = [0, 1, 2, 3]; list.map(elem => elem + 1); list.map(elem => elem + 2); 

看上去效率有点低,处理函数封装下?实现

可是map的回调函数只接受当前元素 elem这一个参数,服务器托管看上去好像没有办法封装...

你也许会想:如果能拿到一个部分配置好的柯里函数就好了,比如说:

// plus返回部分配置好的化及函数 const plus1 = plus(1); const plus2 = plus(2); plus1(5); // => 6 plus2(7); // => 9 

把这样的函数传进map:

const list = [0, 1, 2, 3]; list.map(plus1); // => [1, 2, 3, 4] list.map(plus2); // => [2, 3, 4, 5] 

是不是很棒棒?这样一来不管是加多少,只需要list.map(plus(x))就好了,精巧***实现了封装,自动柯可读性大大提高!实现 (☆゚∀゚)

不过问题来了:

这样的plus函数要怎么实现呢?

这时候柯里化就能派上用场了:

柯里化函数

// 原始的加法函数 function origPlus(a, b) {    return a + b; } // 柯里化后的plus函数 function plus(a) {    return function(b) {      return a + b;   } } // ES6写法 const plus = a => b => a + b; 

可以看到,柯里化的 plus 函数首先接受一个参数a,然后返回一个接受一个参数b 的函数,由于闭包的原因,返回的函数可以访问到父函数的参数 a,亿华云所以举个例子:const plus2 = plus(2)就可等效视为function plus2(b) { return 2 + b; },这样就实现了部分配置

通俗地讲,柯里化就是一个部分配置多参数函数的过程,每一步都返回一个接受单个参数的部分配置好的函数。一些极端的情况可能需要分很多次来部分配置一个函数,比如说多次相加:

multiPlus(1)(2)(3); // => 6 

这种写法看着很奇怪吧?不过如果入了JS的函数式编程这个大坑的话,这会是常态。(笑)

JS中自动柯里化的精巧实现

柯里化(Currying)是函数式编程中很重要的一环,很多函数式语言(eg. Haskell)都会默认将函数自动柯里化。然而JS并不会这样,因此我们需要自己来实现自动柯里化的函数。源码下载

先上代码:

// ES5 function curry(fn) {    function _c(restNum, argsList) {      return restNum === 0 ?       fn.apply(null, argsList) :       function(x) {          return _c(restNum - 1, argsList.concat(x));       };   }   return _c(fn.length, []); } // ES6 const curry = fn => {    const _c = (restNum, argsList) => restNum === 0 ?     fn(...argsList) : x => _c(restNum - 1, [...argsList, x]);   return _c(fn.length, []); } /
域名
上一篇:4、待所有域名查询结束后可在右侧点击导出结果,即可以excel的文件方式将查询到的结果导出。
下一篇:个人域名转为公司需要什么条件?个人域名转为公司该怎么做?