柯理化函数编程思想(代码片段)

mrzhujl mrzhujl     2022-11-29     301

关键词:

柯理化函数编程思想:

  函数柯里化(function currying)又称部分求值。一个currying的函数首先会接受一些参数,接受了这些参数后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包里被保存起来。待到函数真正需要求值的时候,之前传入的参数都会被一次性用于求值。
 
  假设我们要编写一个计算每月开销的函数。在每天结束之前,我们都要记录今天花了多少钱,代码如下:
var monthlyCost = 0;

var cost = function(money)
    monthlyCost += money;
;

cost(100);//第一天开销
cost(200);//第二天开销
cost(300);//第三天开销
//cost(700);//第三十天开销

alert(monthlyCost);//输出:600
  这段代码在每天结束后都会记录并计算到今天为止花了多少钱,但我们不太关心每天花掉多少,只想知道月底总共花掉了多少,也就是说,只需要在月底计算一次。
  如果在每个月的前二十九天,我们都只是保存好当天的开销,直到第30天才进行求值计算,这就达到了我们的目的。下面的代码还不是一个currying函数的完整实现,但有助于我们了解其思想:
var cost = (function()
    var args = [];
    
    return function()
        if(arguments.length === 0)
            var money = 0;
            for(var i = 0, l = args.length; i < l; i++)
                money += args[i];
            
            return money;
        else
            [].push.apply(args, arguments);
        
    
());

cost(100);//未真正求值
cost(200);//未真正求值
cost(300);//未真正求值

console.log(cost());//求值并输出:600
  接下来编写一个通用的function currying(),它接受一个参数,即将要被currying的函数。在这个例子里,这个函数的作用是遍历本月每天的开销并求出它们的总和。代码如下:
var currying = function(fn)
    var args = [];  
    return function()
        if(arguments.length === 0)
            return fn.apply(this, args);
        else
            [].push.apply(args, arguments);
            return arguments.callee;//arguments.callee是指向参数arguments对象的函数。
        
    
;

var cost = (function()
    var money = 0;   
    return function()
        for(var i = 0, l = arguments.length; i < l; i++)
            money += arguments[i];
        
        return money;
    
());

var cost = currying(cost);//转化为currying函数

cost(100);//未真正求值
cost(200);//未真正求值
cost(300);//未真正求值

console.log(cost());//求值并输出:600
  至此,我们完成了一个currying函数的编写,当调用cost()时,如果明确带上参数,表明此时并不进行真正的求值计算,而是把这些参数保存起来,此时让cost()函数返回另外一个函数。只有当我们以不带参数的形式执行cost()时,才利用前面保存的所有参数,真正开始求值计算。

内容来自曾探,《JavaScript设计模式与开发实践》,P49

 

 

 

 

 
 
 
 
 
 
 

scala函数(柯理化)(代码片段)

scala函数柯理化,上代码,一目了然objectFunctiondefmain(args:Array[String])valname="zhangsan"valid="001"valfirst=showInfo(name)valsecond=first(id)second("playbaseketball")second("swiming")showInfo1(name)(id)("play 查看详情

js函数式编程基础:高阶函数柯理化函数合成loadash

一、函数式编程什么是函数式编程(FP)?FP是一种编程范式,也是一种编程风格,和面向对象是并列的关系。FP用于描述数据或函数之间的映射;根据输入通过某种运算获得相应的输出,即映射关系,例如:y=sin(x)。FP需要有输入和... 查看详情

柯理化

...成多个嵌套的只要传入一个参数的函数在普通函数中的柯理化:varadd=function(x,y){ returnx+y;}柯里化:varaddCurring=function(x){ returnfunction(y){ returnx+y;}} addCurring(1)(2);//3 如果是多个参 查看详情

通过模拟strcpy函数学习编程思想(代码片段)

目录strcpy函数简介最初版代码第一次优化:简化代码第二次优化:代码有效性断言(assert)的介绍代码实现第三次优化:字符串的安全性关于const修饰符代码实现第四次优化:靠近标准库函数总结与提示​​​​​​... 查看详情

函数式编程java函数式编程学习(代码片段)

函数式编程-Stream流函数式编程思想概述面向对象思想关注的是用什么对象完成什么事情,而函数式编程思想就类似于数学中的函数,主要关注的是对数据进行了什么操作优点代码简洁,开发快;接近自然语言࿰... 查看详情

函数式编程java函数式编程学习(代码片段)

函数式编程-Stream流函数式编程思想概述面向对象思想关注的是用什么对象完成什么事情,而函数式编程思想就类似于数学中的函数,主要关注的是对数据进行了什么操作优点代码简洁,开发快;接近自然语言࿰... 查看详情

编程思想(代码片段)

...一个能解决这个事情的对象,调用对象的方法,完成事情函数式编程思想  只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程 匿名内部类  匿名内部类的好处与弊端    一方面,匿名内... 查看详情

函数式编程基本概念(代码片段)

编程范式命令式编程(Imperative)声明式编程(Declarative)函数式编程(Functional)面向对象、泛型、元编程也都是很主要的编程范式命令式编程:命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么声... 查看详情

面向对象编程(代码片段)

...程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数.2.函数式编程:"函数式编程"是一种"编程范式",也就是如何编写程序的方法论。它属于&qu... 查看详情

python爬虫编程思想(106):基于splash的爬虫--异步处理与go函数(代码片段)

...;      Splash支持异步处理,例如,go函数就是通过异步方式访问页面的,不过go函数并不能指定异步回调函数,所以在调用go函数后,需要使用wait函数等待一会,这样可以给页面装载留有一定的时间。 &nbs... 查看详情

用函数式编程,从0开发3d引擎和编辑器:函数式编程准备(代码片段)

大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备。函数式编程的优点1.粒度小相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小。正所谓:我只想要一个香蕉,而面向对象... 查看详情

python爬虫编程思想(71):打开文件(代码片段)

        open函数用于打开文件,通过该函数的第1个参数指定要打开的文件名(可以是相对路径,也可以是绝对路径)。f=open(\'test.txt\')f=open(\'./files/test.txt\')        如果使... 查看详情

python爬虫编程思想(80):将类实例转换为json字符串(代码片段)

        dumps函数不仅可以将字典转换为JSON字符串,还可以将类实例转换为JSON字符串。dumps函数需要通过default关键字参数指定一个回调函数,在转换的过程中,dumps函数会向这个回调函数传入类实例(... 查看详情

python编程思想:数字及其相关运算(代码片段)

...程思想》总目录 目录1.数值类型之间的转换2.常用的数学函数​3.运算符(1)算术运算符(2)比较运算符​(3)赋值运算符(4)逻辑运算符(5)位运算符(6)成员运算符李宁老师... 查看详情

python爬虫编程思想(71):打开文件(代码片段)

        open函数用于打开文件,通过该函数的第1个参数指定要打开的文件名(可以是相对路径,也可以是绝对路径)。f=open(\'test.txt\')f=open(\'./files/test.txt\')        如果使... 查看详情

python爬虫编程思想(74):使用fileinput对象读取文件(代码片段)

...  如果需要读取一个非常大的文件时,使用readlines函数会占用太多内存,因为该函数会一次性将文件所有的内容都读到列列表中,列表中的数据都需要放到内存中,所以非常占内存,为了解决这个问题,可以使用for循环和... 查看详情

python爬虫编程思想(136):多线程和多进程爬虫--thread类与线程函数(代码片段)

...ock)检测线程是否释放,以及使用锁可以保证所有的线程函数都执行完毕再往下执行。如果使用Thread类处理线程就方便得多了,可以直接使用Thread对象的join方法等待线程函数执行完毕再往下执行,也就是说,在主线程(main函数... 查看详情

面向对象编程(代码片段)

...程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数.2.函数式编程:"函数式编程"是一种"编程范式",也就是如何编写程序的方法论。它属于&qu... 查看详情