编程范式游记
陈皓(网名“左耳朵耗子”)
资深技术专家
立即订阅
2 人已学习
课程目录
已更新 11 讲 / 共 11 讲
01 | 编程范式游记:起源
免费
02 | 编程范式游记:泛型编程
03 | 编程范式游记:类型系统和泛型的本质
04 | 编程范式游记:函数式编程
05 | 编程范式游记:修饰器模式
06 | 编程范式游记:面向对象编程
07 | 编程范式游记:基于原型的编程范式
08 | 编程范式游记:Go 语言的委托模式
09 | 编程范式游记:编程的本质
10 | 编程范式游记:逻辑编程范式
11 | 编程范式游记:程序世界里的编程范式
编程范式游记
登录|注册

04 | 编程范式游记:函数式编程

陈皓 2019-07-16
从前三章内容中,我们了解到,虽然 C 语言简单灵活,能够让程序员在高级语言特性之上轻松进行底层上的微观控制,被誉为“高级语言中的汇编语言”,但其基于过程和底层的设计初衷又成了它的短板。
在程序世界中,编程工作更多的是解决业务上的问题,而不是计算机的问题,我们需要更为贴近业务、更为抽象的语言,如典型的面向对象语言 C++ 和 Java 等。
C++ 很大程度上解决了 C 语言中的各种问题和不便,尤其是通过类、模板、虚函数和运行时识别等解决了 C 语言的泛型编程问题。然而,如何做更为抽象的泛型呢?答案就是函数式编程(Functional Programming)。

函数式编程

相对于计算机的历史而言,函数式编程其实是一个非常古老的概念。函数式编程的基础模型来源于 λ 演算,而 λ 演算并没有被设计在计算机上执行。它是由 Alonzo Church 和 Stephen Cole Kleene 在 20 世纪 30 年代引入的一套用于研究函数定义、函数应用和递归的形式系统。
如 Alonzo 所说,像 booleans、integers 或者其他的数据结构都可以被函数取代掉。
我们来看一下函数式编程,它的理念就来自于数学中的代数。
f(x)=5x^2+4x+3
g(x)=2f(x)+5=10x^2+8x+11
h(x)=f(x)+g(x)=15x^2+12x+14
假设 f(x) 是一个函数,g(x) 是第二个函数,把 f(x) 这个函数套下来,并展开。然后还可以定义一个由两个一元函数组合成的二元函数,还可以做递归,下面这个函数定义就是斐波那契数列。
f(x)=f(x-1)+f(x-2)
对于函数式编程来说,它只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的
函数式编程有以下特点。
特征
stateless:函数不维护任何状态。函数式编程的核心精神是 stateless,简而言之就是它不能存在状态,打个比方,你给我数据我处理完扔出来。里面的数据是不变的。
immutable:输入数据是不能动的,动了输入数据就有危险,所以要返回新的数据集。
优势
没有状态就没有伤害。
并行执行无伤害。
Copy-Paste 重构代码无伤害。
函数的执行没有顺序上的问题。
函数式编程还带来了以下一些好处。
惰性求值。这需要编译器的支持,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值。也就是说,语句如 x:=expression; (把一个表达式的结果赋值给一个变量) 显式地调用这个表达式被计算并把结果放置到 x 中,但是先不管实际在 x 中的是什么,直到通过后面的表达式中到 x 的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。
确定性。所谓确定性,就是像在数学中那样,f(x) = y 这个函数无论在什么场景下,都会得到同样的结果,而不是像程序中的很多函数那样。同一个参数,在不同的场景下会计算出不同的结果,这个我们称之为函数的确定性。所谓不同的场景,就是我们的函数会根据运行中的状态信息的不同而发生变化。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编程范式游记》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • Transient
    用了一个多小时看完了内容,第一次理解了函数式编程,下面我来整理一下我的笔记。

    1.函数式编程在Python中的应用:装饰器,Map,Reduce,Filter和Scrapy框架中也用到了很多函数式编程的思想。

    2.面相对象是把对象当参数传递,函数式编程是把函数当参数传递。

    3.递归和管道也是函数式编程的重要思想。

    4.将简单的特定细节交给其它函数来做,重点关注描述问题,而不是怎么实现这个事情。

    5.过程式编程范式叫做:指令编程。
       函数式编程范式叫做:声明式编程。

    6.过程式编程:关注的是怎么做,各个函数之间的数据往往是共享的,这些函数是有状态的。

    7.函数式编程:关注做什么,各个函数之间的数据没有共享变量,函数间通过参数和返回值来传递数据,在每个函数里也没有临时变量,for循环被递归取代。

    8.函数式编程的好处:高并发不用加锁,提高并行效率,并且提高了代码重用性。
    2019-07-29
    6
  • 沧月寒心
    作为一个Pythonista,最后一个pipeline示例很赞!
    2019-07-23
    6
  • __Sunde__
    尾递归那里有个小错误,应该是

    ;;; another version of recursion
        (define (factoral_x n)
         (define (iter product counter)
         (if (> counter n)
         product
         (iter (* counter product) (+ counter 1))))
         (iter 1 1))
        
        (newline)
        (display(factoral_x 5))
    2019-07-27
    1
  • 黄翔
    函数之间的编排体现了要做什么,函数的实现体现了怎么做。不知道理解得对不对?
    2019-08-03
  • z
    老师 是时候拥抱python3了...上来试了一哈代码,报错,一时还没反应过来是版本问题
    2019-07-23
收起评论
5
返回
顶部