zoukankan      html  css  js  c++  java
  • 函数式编程,高阶函数,纯函数,函数柯里化

    函数式编程

    百科定义:

    函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

    个人理解就是我们的编程是以函数作为单元来处理各个业务逻辑,函数既可以当做参数传来传去,也可以作为返回值,可以把函数理解一个值到另一个值得映射关系,由于函数式编程方式更适合于数据处理,随着存储器容量升高、计算机处理能力大幅提高,它的优势更加明显,最近支持函数式编程的语言也逐渐流行,比如python、scale等都因它们对函数式编程的支持被人们重视,从被遗忘的角落重新拾起。

    函数式编程因为其特点更适用于统计分析数据、科学计算、大数据处理等方面工作,当然并不限于这些,在web开发、服务器脚本等其它方面也很不错,而面向对象编程更适合于开发和处理业务性强、功能模块完备的大型业务系统。

    编程语言主要有三种类型[3]:

    命令式编程(Imperative Programming): 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。
    函数式编程(Functional Programming):把运算过程尽量写成一系列嵌套的函数调用。
    逻辑式编程(Logical Programming):它设定答案须符合的规则来解决问题,而非设定步骤来解决问题。过程是事实+规则=结果。
    ===========

    高阶函数

    高阶函数的英文名叫 Higher-Order Function,熟悉 React 的朋友应该知道高阶组件 Higher-Order Component。没错,React 的高阶组件本质上就是高阶函数。

    那么,什么是高阶函数呢?
    高阶函数源自于函数式编程(不熟悉的朋友请看《javascript中的函数式编程》),是函数式编程的基本技术。

    那么,JS作为一门“一切皆为对象”的语言,是如何拥有函数式编程的能力呢?
    是因为在JS中函数是一等公民,即函数可以被赋值给变量,被变量引用,这便使得函数可以作为参数,在其他函数间相互传递:

    /** 
     * 数值转换
     * @param {Number} val 要被处理的数值
     * @param {Function} fn 处理输入的val
     * @return {Number || String}
     */
    const toConvert = function(val, fn) {
        return fn(val);
    };
    
    const addUnitW = function(val) {
        return val + 'W';
    };
    
    toConvert(123.1, Math.ceil); // 124
    toConvert(123.1, addUnitW); // "123.1W"
    



    另外,JS的回调函数同样是以实参形式传入其他函数中,这也是高阶函数(在函数式编程中回调函数被称为 lambda表达式):

    [1, 2, 3, 4, 5].map(d => d ** 2); // [1, 4, 9, 16, 25]
    
    // 以上,等同于:
    const square = d => d ** 2;
    [1, 2, 3, 4, 5].map(square); // [1, 4, 9, 16, 25]
    ==========
    纯函数
    什么是纯函数

    纯函数是函数式编程中非常重要的一个概念,简单来说,就是一个函数的返回结果只依赖于它的参数,并且在执行过程中没有副作用,我们就把这个函数叫做纯函数。

    const a = 1
    const pure = (x, b) => x + b
    pure(1,2) //3

    现在,pure的返回结果只依赖于它的参数xb,就是说,只要代码不变,pure(1, 2)的返回值永远是3。

    使用纯函数的优点
    1. 可复用性

    纯函数仅依赖于传入的参数,这意味着你可以随意将这个函数移植到别的代码中,只需要提供踏需要的参数即可。如果是非纯函数,有可能你需要一根香蕉,却需要将整个香蕉树搬过去。

    2. 可测试性

    纯函数非常容易进行单元测试,因为不需要考虑上下文环境,只需要考虑输入和输出。

    3. 并行代码

    纯函数是健壮的,改变执行次序不会对系统造成影响,因此纯函数的操作可以并行执行。

    ==============
    函数柯里化
     
    在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

    例如有一个简单的加法函数,他能够将自身的三个参数加起来并返回计算结果。

    function add(a, b, c) {
        return a + b + c;
    }
    

    那么add函数的柯里化函数_add则可以如下:

    function _add(a) {
        return function(b) {
            return function(c) {
                return a + b + c;
            }
        }
    }
    

    下面的运算方式是等价的。

    add(1, 2, 3);
    _add(1)(2)(3);


    作者:这波能反杀
    链接:https://www.jianshu.com/p/5e1899fe7d6b
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    TCP/IP断网仍然显示连通状态禁止“媒体感知”
    ASP.NET页面优化,提高载入速度方法大全
    国家气象局提供
    datatable&list<T>
    windows mobile C# net3.5 如何捕捉Arrow的CheckBox的KeyDown事件?
    hhclass 类 RAPI OpenNETCF.Desktop.Communication.DLL相关下载
    string和stringBuilder区别
    windows mobile全屏设置笔记
    CSS浮动(float,clear)通俗讲解
    js图片延时加载(jquery特效)
  • 原文地址:https://www.cnblogs.com/fs0196/p/12686107.html
Copyright © 2011-2022 走看看