精华内容
下载资源
问答
  • 一、是什么函数式编程是一种"编程范式"(programming paradigm),一种编写程序的方法论主要的编程范式有三种:命令式编程,声明式编程和函数式编程相比命令式编...

    一、是什么

    函数式编程是一种"编程范式"(programming paradigm),一种编写程序的方法论

    主要的编程范式有三种:命令式编程,声明式编程和函数式编程

    相比命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而非设计一个复杂的执行过程

    举个例子,将数组每个元素进行平方操作,命令式编程与函数式编程如下

    // 命令式编程
    var array = [0, 1, 2, 3]
    for(let i = 0; i < array.length; i++) {
        array[i] = Math.pow(array[i], 2)
    }
    
    // 函数式方式
    [0, 1, 2, 3].map(num => Math.pow(num, 2))
    

    简单来讲,就是要把过程逻辑写成函数,定义好输入参数,只关心它的输出结果

    即是一种描述集合和集合之间的转换关系,输入通过函数都会返回有且只有一个输出值

    可以看到,函数实际上是一个关系,或者说是一种映射,而这种映射关系是可以组合的,一旦我们知道一个函数的输出类型可以匹配另一个函数的输入,那他们就可以进行组合

    二、概念

    纯函数

    函数式编程旨在尽可能的提高代码的无状态性和不变性。要做到这一点,就要学会使用无副作用的函数,也就是纯函数

    纯函数是对给定的输入返还相同输出的函数,并且要求你所有的数据都是不可变的,即纯函数=无状态+数据不可变

    举一个简单的例子

    let double = value=>value*2;
    

    特性:

    • 函数内部传入指定的值,就会返回确定唯一的值

    • 不会造成超出作用域的变化,例如修改全局变量或引用传递的参数

    优势:

    • 使用纯函数,我们可以产生可测试的代码

    test('double(2) 等于 4', () => {
      expect(double(2)).toBe(4);
    })
    
    • 不依赖外部环境计算,不会产生副作用,提高函数的复用性

    • 可读性更强 ,函数不管是否是纯函数  都会有一个语义化的名称,更便于阅读

    • 可以组装成复杂任务的可能性。符合模块化概念及单一职责原则

    高阶函数

    在我们的编程世界中,我们需要处理的其实也只有“数据”和“关系”,而关系就是函数

    编程工作也就是在找一种映射关系,一旦关系找到了,问题就解决了,剩下的事情,就是让数据流过这种关系,然后转换成另一个数据,如下图所示

    在这里,就是高阶函数的作用。高级函数,就是以函数作为输入或者输出的函数被称为高阶函数

    通过高阶函数抽象过程,注重结果,如下面例子

    const forEach = function(arr,fn){
        for(let i=0;i<arr.length;i++){
            fn(arr[i]);
        }
    }
    let arr = [1,2,3];
    forEach(arr,(item)=>{
        console.log(item);
    })
    

    上面通过高阶函数 forEach来抽象循环如何做的逻辑,直接关注做了什么

    高阶函数存在缓存的特性,主要是利用闭包作用

    const once = (fn)=>{
        let done = false;
        return function(){
            if(!done){
                fn.apply(this,fn);
            }else{
                console.log("该函数已经执行");
            }
            done = true;
        }
    }
    

    柯里化

    柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程

    一个二元函数如下:

    let fn = (x,y)=>x+y;
    

    转化成柯里化函数如下:

    const curry = function(fn){
        return function(x){
            return function(y){
                return fn(x,y);
            }
        }
    }
    let myfn = curry(fn);
    console.log( myfn(1)(2) );
    

    上面的curry函数只能处理二元情况,下面再来实现一个实现多参数的情况

    // 多参数柯里化;
    const curry = function(fn){
        return function curriedFn(...args){
            if(args.length<fn.length){
                return function(){
                    return curriedFn(...args.concat([...arguments]));
                }
            }
            return fn(...args);
        }
    }
    const fn = (x,y,z,a)=>x+y+z+a;
    const myfn = curry(fn);
    console.log(myfn(1)(2)(3)(1));
    

    关于柯里化函数的意义如下:

    • 让纯函数更纯,每次接受一个参数,松散解耦

    • 惰性执行

    组合与管道

    组合函数,目的是将多个函数组合成一个函数

    举个简单的例子:

    function afn(a){
        return a*2;
    }
    function bfn(b){
        return b*3;
    }
    const compose = (a,b)=>c=>a(b(c));
    let myfn =  compose(afn,bfn);
    console.log( myfn(2));
    

    可以看到compose实现一个简单的功能:形成了一个新的函数,而这个函数就是一条从 bfn -> afn 的流水线

    下面再来看看如何实现一个多函数组合:

    const compose = (...fns)=>val=>fns.reverse().reduce((acc,fn)=>fn(acc),val);
    

    compose执行是从右到左的。而管道函数,执行顺序是从左到右执行的

    const pipe = (...fns)=>val=>fns.reduce((acc,fn)=>fn(acc),val);
    

    组合函数与管道函数的意义在于:可以把很多小函数组合起来完成更复杂的逻辑

    三、优缺点

    优点

    • 更好的管理状态:因为它的宗旨是无状态,或者说更少的状态,能最大化的减少这些未知、优化代码、减少出错情况

    • 更简单的复用:固定输入->固定输出,没有其他外部变量影响,并且无副作用。这样代码复用时,完全不需要考虑它的内部实现和外部影响

    • 更优雅的组合:往大的说,网页是由各个组件组成的。往小的说,一个函数也可能是由多个小函数组成的。更强的复用性,带来更强大的组合性

    • 隐性好处。减少代码量,提高维护性

    缺点:

    • 性能:函数式编程相对于指令式编程,性能绝对是一个短板,因为它往往会对一个方法进行过度包装,从而产生上下文切换的性能开销

    • 资源占用:在 JS 中为了实现对象状态的不可变,往往会创建新的对象,因此,它对垃圾回收所产生的压力远远超过其他编程方式

    • 递归陷阱:在函数式编程中,为了实现迭代,通常会采用递归操作

    最后

    这里也给大家包邮送5本最近很火的新书《前端函数式演进》

    《前端函数式演进》是一部写给前端工程师的函数式编程实战指南,由阿里本地生活企业订餐前端负责人撰写。

    作者结合自己在前端领域的大量工程实践经验,首先从前端开发者的角度介绍了函数式编程在前端领域的演进,以及前端必备的函数式编程知识;然后对React和RxJS等流行前端工具的函数式编程功能和思想进行了深入剖析,既可以帮助读者更好地理解和使用这些工具,又能给予读者技术选型方面的建议。此外,书中提供了平台级别的前端开发示例的多种实现,方便读者结合书中的理论进行印证和思考

    参与方式

    拼手气三本:

    • 后台回复 666 获取抽奖码

    • 明晚 18:00 小程序自动开奖,中奖者24小时内填写收件信息,逾期视为作废

    点在看二本:

    • 从在看列表随机抽两位小伙伴,中奖结果最终会公布到朋友圈,参于在看抽奖记得一定要加小编好友噢

    • 明晚 18:00 朋友圈公布中奖名单

    参考文献

    • https://zhuanlan.zhihu.com/p/81302150


    --The End--

    系列正在更新:25/33

    篇副有限,扫下方二维码查看往期

    展开全文
  • 面向函数式编程-讲解

    2018-03-19 23:05:00
    主要讲解函数式编程好处和优缺点。 主要讲解函数式编程好处和优缺点。 主要讲解函数式编程好处和优缺点
  • 函数式编程(一)

    2019-05-08 15:20:58
    函数式编程优缺点 函数式编程 函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 函数式编程与声明式编程、命令式编程区别 命令式编程...

    总览

    1. 什么是函数式编程?
    2. 函数式编程与声明式编程、命令式编程区别
    3. 函数式编程特点
    4. 函数式编程优缺点

    函数式编程

    函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

    函数式编程与声明式编程、命令式编程区别

    • 命令式编程(也称为过程化编程),其关注计算机执行步骤,也就是需要告诉计算机先做什么再做什么。

    • 声明式编程通常被看做是形式逻辑的理论,把计算看做推导。也就是告诉计算机要做什么,但不指定具体如何做。(SQL)

    • 函数式编程也是关注做什么而不是怎么做。但是其还有一些额外的特性。

    特点

    • 函数是第一等公民(高阶函数)

    • 没有副作用(纯函数)

    优缺点

    优点

    • 代码简洁,开发快速
    • 接近自然语言,易于理解
    • 更方便的代码管理
    • 易于"并发编程"
    • 代码的热升级

    缺点

    • 内存消耗

    备注

    文本有些观点可能描述不准确,更有甚者是错误的。但是,我们可以先这样理解它。

    注:文中部分内容摘自百度百科

    展开全文
  • 函数式编程和面向对象编程的优缺点2.1 函数式编程优点缺点2.2 面对对象编程优点缺点3.为什么在并行计算中函数式编程比较好3.1 什么是并行计算3.2 函数式编程兴起原因 目录 1.函数式编程和面向对象编程概念 1.1 函数...

    目录

    1.函数式编程和面向对象编程概念

    1.1 函数式编程

    什么是函数式编程?在维基百科中给出了详细的定义,函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)
    函数式编程,顾名思义,这种编程是以函数思维做为核心,在这种思维的角度去思考问题。这种编程最重要的基础是λ演算,接受函数当作输入和输出。

    1.2 面向对象编程

    面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
    对象与对象之间的关系是面向对象编程首要考虑的问题,而在函数式编程中,所有的数据都是不可变的,不同的函数之间通过数据流来交换信息,函数作为FP中的一等公民,享有跟数据一样的地位,可以作为参数传递给下一个函数,同时也可以作为返回值。
    面向对象编程,这种编程是把问题看作由对象的属性与对象所进行的行为组成。基于对象的概念,以类作为对象的模板,把类和继承作为构造机制,以对象为中心,来思考并解决问题。

    2.函数式编程和面向对象编程的优缺点

    2.1 函数式编程

    优点
    • 支持闭包和高阶函数,闭包是一种可以起函数的作用并可以如对象般操作的对象;而高阶函数是可以以另一个函数作为输入值来进行编程。支持惰性计算,这就可以在求值需要表达式的值得时候进行计算,而不是固定在变量时计算。还有就是可以用递归作为控制流程。函数式编程所编程出来的代码相对而言少很多,而且更加简洁明了。
    • 在函数式编程中,由于数据全部都是不可变的,所以没有并发编程的问题,是多线程安全的。可以有效降低程序运行中所产生的副作用,对于快速迭代的项目来说,函数式编程可以实现函数与函数之间的热切换而不用担心数据的问题,因为它是以函数作为最小单位的,只要函数与函数之间的关系正确即可保证结果的正确性。
    • 函数式编程的表达方式更加符合人类日常生活中的语法,代码可读性更强。实现同样的功能函数式编程所需要的代码比面向对象编程要少很多,代码更加简洁明晰。函数式编程广泛运用于科学研究中,因为在科研中对于代码的工程化要求比较低,写起来更加简单,所以使用函数式编程开发的速度比用面向对象要高很多,如果是对开发速度要求较高但是对运行资源要求较低同时对速度要求较低的场景下使用函数式会更加高效。

    缺点

    • 由于所有的数据都是不可变的,所以所有的变量在程序运行期间都是一直存在的,非常占用运行资源。同时由于函数式的先天性设计导致性能一直不够。虽然现代的函数式编程语言使用了很多技巧比如惰性计算等来优化运行速度,但是始终无法与面向对象的程序相比,当然面向对象程序的速度也不够快。
    • 函数式编程虽然已经诞生了很多年,但是至今为止在工程上想要大规模使用函数式编程仍然有很多待解决的问题,尤其是对于规模比较大的工程而言。如果对函数式编程的理解不够深刻就会导致跟面相对象一样晦涩难懂的局面。

    2.2 面对对象编程

    优点

    • 面向对象编程:面向对象有三个主要特征,分别是封装性、继承性和多态性。类的说明展现了封装性,类作为对象的模板,含有私有数据和公有数据,封装性能使数据更加安全依赖的就是类的特性,使得用户只能看到对象的外在特性,不能看到对象的内在属性,用户只能访问公有数据不能直接访问到私有数据。类的派生功能展现了继承性,继承性是子类共享父类的机制,但是由于封装性,继承性也只限于公有数据的继承(还有保护数据的继承),子类在继承的同时还可以进行派生。而多态性是指对象根据接收的信息作出的行为的多态,不同对象接收同一信息会形成多种行为。
    • 面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反。传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。同时它也是易拓展的,由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
    • 在面向对象编程的基础上发展出来的23种设计模式广泛应用于现今的软件工程中,极大方便了代码的书写与维护。
      • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
      • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
      • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    缺点

    • 面向对象编程以数据为核心,所以在多线程并发编程中,多个线程同时操作数据的时候可能会导致数据修改的不确定性。
    • 在现在的软件工程中,由于面向对象编程的滥用,导致了很多问题。首先就是为了写可重用的代码而产生了很多无用的代码,导致代码膨胀,同时很多人并没有完全理解面向对象思想,为了面向对象而面向对象,使得最终的代码晦涩难懂,给后期的维护带来了很大的问题。所以对于大项目的开发,使用面向对象会出现一些不适应的情况。
    • 面向对象虽然开发效率高但是代码的运行效率比起面向过程要低很多,这也限制了面向对象的使用场景不能包括那些对性能要求很苛刻的地方。

    3.为什么在并行计算中函数式编程比较好

    3.1 什么是并行计算

    并行计算或称平行计算是相对于串行计算来说的。它是一种一次可执行多个指令的算法,目的是提高计算速度,及通过扩大问题求解规模,解决大型而复杂的计算问题。所谓并行计算可分为时间上的并行和空间上的并行。 时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。[百度百科]
    在这里插入图片描述

    3.2 函数式编程兴起原因

    随着web2.0的到来,无论是数据的数量还是数据的形式都大大的增加。而随着芯片制造工艺的限制,硬件摩尔定律的失效,而大数据的摩尔定律的发展,对计算机的计算能力要求越来越高,压力也越来越大。其中并行计算是一个很好的解决方法。而目前比较流行的一种并行计算方式是使用集群进行并行计算。这就需要我们把一个大的任务进行拆解成很多小问题,然后在不同的机器上单独进行运行,最终将计算结果进行合并,这便是Hadoop中MapReduce的思想。函数式编程具有:不可变性和并行操作性两个特点,使得函数式编程思想在并行计算中发挥比较大的作用。这也是函数式编程兴起的原因。

    展开全文
  • 卡内基梅隆大学教授Robert Harper在博客上称,该校计算机科学系从大一新生课程中删除了面向对象编程。他说,面向对象编程从入门课程中完全取消了,因为O-O的性质是反模块化和反并行的,不适合进入现代计算机科学教学...

    卡内基梅隆大学教授Robert Harper在博客上称,该校计算机科学系从大一新生课程中删除了面向对象编程。他说,面向对象编程从入门课程中完全取消了,因为O-O的性质是反模块化和反并行的,不适合进入现代计算机科学教学课程。新课程提议是面向对象的设计学。

    展开全文
  • 函数式编程常用术语

    千次阅读 2017-02-11 20:56:50
    近年来函数式编程这种概念渐渐流行起来,尤其是在React/Vuejs这两个前端框架的推动下,函数式编程就像股新思潮一般瞬间席卷整个技术圈。虽然博主接触到的前端技术并不算深入,可这并不妨碍我们通过类似概念的延伸来...
  • Scala 函数式编程

    2015-07-10 10:25:43
    a、什么是函数编程 b、函数编程和面向对象编程的区别 c、函数编程优缺点 d、
  • 一、函数式编程与面向对象编程的优缺点 1、函数式编程优缺点 (1)、函数式编程的优点: ①、由于数据全部都是不可变的,所以没有并发编程的问题,多线程是安全的。 ②、对于快速迭代的项目来说,函数式编程可以...
  • 函数式编程与面向对象编程的优劣

    千次阅读 2018-10-28 20:44:44
    函数式编程作为结构化编程的一种,正在受到越来越多的重视。工程中不在只是面向对象编程,更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题。 什么是函数式编程?在维基百科中给出了详细的定义,函数式...
  • 函数式编程作为结构化编程的一种,正在受到越来越多的重视。工程中不在只是面向对象编程,更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题。 什么是函数式编程?在维基百科中给出了详细的定义,函数式...
  • 函数式编程的优点

    2020-06-11 04:18:24
    在本系列的第一部分中 ,我讨论了函数式编程的核心概念,并提供了一些示例说明它们如何发挥作用。 函数编程的核心概念列表(再次从第一部分开始)如下: 使用功能作为其他功能的输入和输出, 高阶函数 使用map ...
  • 函数式编程,顾名思义,这种编程是以函数思维做为核心,在这种思维的角度去思考问题。这种编程最重要的基础是λ演算,接受函数当作输入和输出。 面向对象编程,这种编程是把问题看作由对象的属性与对象所进行的行为...
  • 作者:Fernando Doglio 译者:前端小智 来源:medium 移动端阅读:点这里 点赞再看,微信搜索 【大迁世界】 关注...面向对象编程和函数式编程是两种非常不同的编程范式,它们有自己的规则和优缺点。 但是,JavaScri.
  • 使用 Swift 语言编程优缺点

    万次阅读 2017-08-03 14:49:44
    我们的 Swift 项目上线已经有一段时间了。结合目前 Swift 的使用情况,总结下其与 Objective-C 相比的优缺点...函数式编程的支持Swift 语言本身提供了对函数式编程的支持。 Objc 本身是不支持的,但是可以通过引入 Rea
  • 我们接触较多的主要是过程型编程(C语言)、面向对象编程(Java语言)和泛型编程(C++ Template),每种编程范型都有自己的优缺点,在软件开发...而函数式编程是最难的,但是和其他编程范型混用将表现出巨大的杀伤力。
  • Masnory/ SnapKit函数式编程的一个经典的代表作,非常值得参考和学习! 链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道; 那么问题来了,怎么写链式编程呢? 一步步来实现一个函数式编程: ...
  • Lua函数式编程和局部函数详解

    千次阅读 2017-04-04 19:12:01
    函数做一个First-Class Value可以赋值给变量,用后者进行调用: 代码如下: a = function() print 'hello' end a() hello b = a b() hello 匿名函数 代码如下: g = function() return function() print'hello' end ...
  • 最近接手一些代码. 其中用到了许多lambda运算符的函数内联方式的编程。...用一个技术,首先考虑一下这个词汇的优缺点,然后根据语境,选择用不用,如何来用。 设计是选择,是优化,这里的优化,绝不是华丽的
  • day 10 回顾 函数变量 def 函数变量名(形参列表): ...函数可以作为参数传入另一个函数 def fx(fn): … fx(f1) # 和 fx(f1()) 不同 函数可以作为另一个函数的返回值 def fy(): return max def fz(...
  • JavaScript中匿名函数的用法及优缺点

    千次阅读 2012-09-03 10:35:47
    JS中的匿名函数的用法及优缺点 匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。 一、什么是匿名函数? 在...
  • JS中的匿名函数的用法及优缺点 匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。 一、什么是匿名函数? 在...
  • 编程语言的优缺点

    千次阅读 2014-03-01 15:55:46
    开始,准备用C++,但C++太复杂,安全性差,最后用一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾依此投标一个交互电视项目,但被SGI打败。可怜的Oak几乎无家可归,恰巧这时...
  • 一、为什么要使用存储过程和函数 存储过程和函数,是用来实现一组关于表操作的SQL语句、可重复地执行操作数据库的集合。 存储过程和函数可以简单的理解为一条或多条SQL语句的集合。存储过程和函数就是事先经过编译并...
  • 多种编程语言的优缺点梳理

    万次阅读 2019-01-21 15:16:42
    这是我写的旋风编程语言简介 —— 我本来为亚马逊开发者杂志本月的期刊写的,但是发现我写的东西没法见人。 首先,我偶尔一不小心口出脏话,或者对上帝不恭的话,所以在很官方很正式的亚马逊上发表是不合适的; ...
  • MySQL存储过程和函数的区别与优缺点

    千次阅读 2017-07-02 11:17:30
    为什么要使用存储过程和函数 数据库对象存储过程和函数,是用来实现一组关于表操作的SQL语句代码当做一个整体来执行。一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面的SQL语句来执行结果有选择的执行...
  • 机器人主流编程语言盘点 及优缺点分析https://blog.csdn.net/SLAMTEC/article/details/86741125机器人编程语言最早于20世纪70年代初期问世,到目前为止已有多种编程语言出现,在众多机器人编程语言中究竟哪种编程...
  • 几种编程语言的优缺点

    千次阅读 2017-01-22 09:57:15
     这是我写的旋风编程语言简介 —— 我本来为亚马逊开发者杂志本月的期刊写的,但是发现我写的东西没法见人。  首先,我偶尔一不小心口出脏话,或者对上帝不恭的话,所以在很官方很正式的亚马逊上发表是不...
  • 各种编程软件的优缺点对比

    千次阅读 2008-10-10 09:47:00
    方案一 Basic语言 & Visual Basic 优点 (1)Basic 简单易学,很容易上手。 (2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序... 缺点 (1)Visual Basic 不是真正的面向对象的开发文具。
  • 机器人编程语言最早于20世纪70年代初期问世,到目前为止已有多种编程语言出现,在众多机器人编程语言中究竟哪种编程语言最好呢?这个问题困扰了很多新手学者,但遗憾的是,这是一个没有准确答案的问题,你问不同的人...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,932
精华内容 11,972
关键字:

函数式编程优缺点