欢迎找我内推微软

函数柯里化

函数柯里化

在计算机科学中,柯里化(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时,解释器会先调用_addervalueOf函数,没有此函数时则会调用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

https://www.jianshu.com/p/2975c25e4d71

posted @   zmj97  阅读(332)  评论(0编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
欢迎找我内推微软
点击右上角即可分享
微信分享提示