高级函数式编程:What is Currying in JavaScript?

深入理解JavaScript中的Currying:原理、应用与现代实践

Currying 是 JavaScript 中的一个高级函数,用于操作函数的参数和参数。它以“Haskell B. Curry”命名。Javascript 中 currying 的概念来自 Lambda 演算。

Currying 采用一个接收多个参数的函数,并将其分解为一系列 unray(一个参数)函数。因此,currying 函数一次只接受一个参数。

Currying 功能的用途

在 JavaScript 中进行Currying 可能出于以下原因:

  • Currying 在事件处理中很有帮助。
  • 通过使用 currying 函数,我们可以避免多次传递相同的变量。
  • JavaScript 中的Currying 可用于制作高阶函数。

咖喱是如何工作的?

众所周知,JavaScript 中的 currying 是一个需要多个参数的函数。在其中,函数被转换为许多函数,这些系列函数中的每一个都将接受一个参数。

示例一:一个简单的三参数函数

在此示例中,我们将看到一个简单的函数,该函数将接受三个参数:


const addition =(x, y, z)=>{
    return x+y+z
}
console.log(addition(2, 3, 5)) // 10

输出:


10

说明:在上面的例子中,我们给出了三个参数,这些参数被执行加法,结果被打印为输出。

示例二:将现有函数转换为 Curried 函数

在此示例中,我们将使用 see currying 函数的实现,其中函数将接受一个参数,并且它将返回一系列函数。


function sum(x) {   // x is taken as argument here
    return (y) => {
        return (z) => { // this function will return the sum
            return x + y + z
        }
    }
}
console.log(sum(1)(2)(3)) // 6

解释:在上面的例子中,我们 '1' 被传递给函数 “sum”。它将返回一个类似以下函数的函数:


return (y) => {
        return (z) => {
            return x + y + z
        }
}

现在,上面的函数定义将被视为“sum1”,并将“b”作为参数。然后我们将调用函数“sum1”并将其传递给 2。然后 sum1 将返回第三个函数,如下所示:


return (z) => {
            return x + y + z
}

现在,返回的函数将存储在变量“sum2”中。然后调用函数“sum2”,它将以“3”作为参数。


const result = sum2(3);

现在,将使用前面的参数 x、y 和 z 分别为 1、2 和 3 执行计算,并将返回 6。

示例三:创建好友请求 Curry 函数

在这个例子中,我们将创建一个咖喱函数,好友用户可以在其中向他/她的朋友发送好友请求。


function sendReq(greet){  //function is created that will take one argument, 'greet' here
    return function(name){ 
        return function(message){ // name of person and the message is the return value here
            return `${greet} ${name}, ${message}`
        }
    }
}
sendReq('Hello')('Harry')('Can you please add me as your connection on LinkedinIn ?')

输出


Hello Harry, Can you please add me as your connection on LinkedinIn ?

解释:在上面的例子中,创建了一个函数“sendReq”,“greet”是它的唯一参数。此函数将返回用户指定的人员姓名和消息。调用函数时,结果将打印为输出。

基本与高级Currying 技术

基本上,JavaScript 中有两种类型的 Currying。让我们来看看它们。

  1. 基本Currying 
  2. 高级Currying 

在基本 currying 中,函数采用单个参数并返回一系列函数,其中包含所有其他参数。

在这种Currying 中,函数是不完整的,直到函数接收到所有参数。否则,该函数将不会产生任何富有成效的结果

在高级Currying 中,函数中有固定数量的参数。在其中,该函数作为外部函数接收,该函数是包装函数

让我们看看 JavaScript 中这两种Currying 的例子,以便更好地理解。

  • 基本咖喱

const getCakeIngredients = (ingred_1) =>{ // function is declared here
    return (ingred_2) => {
        return (ingred_3) => {
            return ${ingred_1}, ${ingred_2}, ${ingred_3}; 
        } 
    } 
} 
getCakeIngredients('Eggs')('flour')('milk');

解释:在上面的代码中,创建了一个函数“getCakeIngredients”,其参数为“ingred_1”。这个“ingred_1”将返回一系列功能,作为我们制作蛋糕所需的其他成分。在接收所有成分作为参数之前,该函数将不完整。

  • 高级Currying:

const adv_curry =(fn) =>{ // here the function is a outer function
    return curried = (...args) => { 
        if (fn.length !== args.length){ // comparison of function length is done here 
            return curried.bind(null, ...args)
        }
    return fn(...args);
    };
}
const totalNum=(a,b,c) => {
    return a+b+c 
} 
const curriedTotal = adv_curry(totalNum);
console.log(curriedTotal(5) (15) (20));

说明: 在上面的例子中,“Adv_curry”函数被接收为外部函数,这是一个“包装函数”。这里又返回了一个函数“curried”,它使用名为“spread operator”的运算符接收参数。

此运算符用于比较函数长度 'fn.length'。JavaScript 中的扩展运算符用于将数组或对象快速复制到另一个数组或对象中。此复制可以复制用户指定的数组或对象的所有部分或某些部分。

此处传递的参数数将显示函数的 length 属性。每次调用函数时,参数都会不断增加。

ES6 的现代Currying

ES6 是 JavaScript 语法的新修改和即兴创作。arrow 函数用于 JavaScript 中的咖喱。可以使用以下示例中给出的这种现代语法来完成现代咖喱。


const sendReq = greet => name => message =>
`${greet} ${name}, ${message}`
sendReq('Hello')('Harry')('Can you please add me as your connection on LinkedinIn?')

输出


Can you please add me as your connection on LinkedinIn?

currying 可用于在 Javascript 中操作 DOM

JavaScript 中的 currying 也用于修改 JavaScript 中的文档对象模型。正如我们所知,在Currying中,一个函数被用多个参数重写成一系列函数。这会影响网页整个结构的外观。

Currying与部分应用

  • Currying:接受多个参数的函数称为 Currying 函数。通过应用 currying 函数,一个函数被划分为一系列许多函数,除非接受所有参数,否则每个函数都将接受一个参数。
  • 部分函数:部分应用程序的想法来自这样一个事实,即您可以获取一个系统,然后将它们拆分为多个系统。在部分应用中,我们通过将一些参数预填充到原始函数中来创建一个新函数。

让我们看一个例子并了解部分应用。


const addPartial=(a,b,c) => {
    return a+b+c 
}
var partialFunc= addPartial.bind(this,2,3);
partialFunc(5); //returns 10

解释:在上面的示例中,创建了一个函数,该函数将数字相加并返回结果作为输出。分部函数是将一个函数转换为另一个函数的函数,但那里的参数数量较少。

结论

  • JavaScript 中的 Currying 是一种一次接受一个参数并返回一个需要下一个参数的新函数的方法。
  • 使用 currying,可以在函数式编程中创建高阶函数。
  • 使用 Currying,我们还可以在 JavaScript 中修改 DOM 版本。
  • 可以使用 currying 触发事件侦听器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新华

感谢打赏,我会继续努力原创。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值