函数柯里化
函数柯里化
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成
接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
经典例子
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
这个 add
函数就是一个柯里化的函数,实现如下:
function add() {
// 将伪数组arguments转化为数组并存储在_args中,以后接受的所有参数也都存储在_args中
let _args = [].slice.call(arguments);
// _adder 函数将以后接收的参数都存储到_args中
let _adder = function () {
_args.push(...arguments);
// 返回自身(函数),从而可以无限接收参数
return _adder;
}
// 为何使用toString见下文
// toString 返回最后取值, 即所有参数的和
_adder.toString = function () {
return _args.reduce(function (sum, item) {
return sum + item;
});
}
//返回_adder函数
return _adder;
}
为何使用toString
在对象为操作数(表达式中的参数或常量)时,解释器会默认调用对象的valueOf
函数,
当对象为Date
类型且在进行 +
运算时,以及其他所有情况中,解释器会默认调用对象的 toString
函数。
因此,对于上述的add
函数,当我们进行类似于 add(1)(2)(3)
这样的调用时,由于返回的是一个函数,当我们试图单独调用时,解释器就会对其调用toString
来对其转换。
当其在表达式中时,例如 add(1)(2)(3) + 5
时,解释器会先调用_adder
的valueOf
函数,没有此函数时则会调用toString
函数。
参考文章
https://blog.csdn.net/shaofei63/article/details/42743245
https://jingyan.baidu.com/album/3c48dd347c0474e10be358af.html?picindex=3
https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构