zoukankan      html  css  js  c++  java
  • js 函数柯里化

    函数柯里化的主要目的就是为了减少函数传参,同时将一些固定参数私有化。下面展示一段非常简单计算圆面积的代码来说明函数柯里化的原理:

    //circle函数,接受半径r和π
    function circle(r,p){
        //计算半径为r的圆的面积
        var area=p*r*r;
        return area;
    }
    /*
     * 通过函数柯里化来简化circle函数,只传入半径就能计算出面积
     * 不管怎么样,π是不会变的,因此我们将他写死,不需要外部调用传入
     */
    function curryCircle(r){
        var p=3.14;
        var area=p*r*r;
        return area;
    }

    也许你会觉得这段代码很二,但是这就是函数柯里化的真实面目。当然上面的代码只是一个非常小的例子,真实世界中的函数柯里化会比它凶恶一点,下面来讨论一个更通用的例子。假设π不是唯一的(比如我们有三种π),我们计算圆面积公式当中的π会根据场景不同而变化,这个时候我们就不能直接写死,而需要根据不同环境来配置π:

    //circle函数,接受半径r和π
    function circle(r,p){
        //计算半径为r的圆的面积
        var area=p*r*r;
        return area;
    }
    //针对circle函数的柯里化函数
    function curry(fn,p){
        var finalMethod=function(r){
            var result=fn(r,p);
            return result;
        }
        return finalMethod;
    }
    //我们有3种不同的π
    var curryCircle1=curry(circle,1.14);
    var curryCircle2=curry(circle,2.14);
    var curryCircle3=curry(circle,3.14);
    //输出:4.56  8.56  12.56
    console.log(curryCircle1(2),curryCircle2(2),curryCircle3(2));

    可以看到,curry方法通过封装最基础的circle方法,同时保存设置好的p参数(π),并返回一个finalMethod方法,这样我们最终调用finalMethod时就只需要传入参数r(半径)就可以完成。借助函数柯里化,我们拥有了三个简化的计算圆面积方法。

  • 相关阅读:
    Java面向对象之内部类(匿名内部类)
    Java面向对象之内部类(访问格式)
    Java面向对象之USB接口实例
    Java面向对象之多态(成员访问特点) 入门实例
    Java面向对象之多态(向上、向下转型) 入门实例
    Java面向对象之接口interface 入门实例
    Ansible 的安装
    Windows server 2016安装Docker EE
    Docker-py 的使用
    flask 上传文件
  • 原文地址:https://www.cnblogs.com/mengfangui/p/9322286.html
Copyright © 2011-2022 走看看