左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180928 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

33 | 编程范式:函数式编程

higher order function
currying
recursing
pipeline
map & reduce
tail recursion optimization
first class function
数据复制比较严重
函数的执行没有顺序上的问题
Copy-Paste重构代码无伤害
并行执行无伤害
没有状态就没有伤害
immutable
stateless
函数式的pipeline模式
函数式语言的三套件
函数式编程的思维方式
Lisp语言介绍
技术
劣势
优势
特征
函数式编程

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
从前三章内容中,我们了解到,虽然 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
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

函数式编程是一种古老的编程范式,其核心理念源自数学中的代数。该范式强调函数不维护状态,输入数据不可变,且函数执行没有顺序上的问题。函数式编程的优势在于没有状态就没有伤害,可以实现并行执行无伤害和Copy-Paste重构代码无伤害。此外,函数式编程还带来了惰性求值和确定性等好处。然而,函数式编程也存在数据复制比较严重的劣势。在函数式编程中,常用的技术包括头等函数、尾递归优化、map & reduce、管道、递归、柯里化和高阶函数等。这些技术使函数式编程更易读,关注描述问题而不是实现细节。通过函数式编程,可以实现代码的简化和并行执行,同时避免了状态带来的问题。函数式编程的思维方式是声明式编程,关注描述问题而不是实现细节。传统的命令式编程范式依赖于共享的变量来同步其状态,而函数式编程通过参数和返回值来传递数据,避免了共享变量的问题。函数式编程还引入了三套件:Map、Reduce 和 Filter,通过这些函数可以更简洁地描述数据操作,减少了循环体和临时变量的使用。函数式编程的思路是描述要干什么,而不是怎么干,使得代码更易读、更简洁。文章还介绍了函数式的pipeline模式,借鉴于Unix Shell的管道操作,通过一系列嵌套的函数调用来完成流式计算。通过示例展示了如何使用函数式的pipeline方式来处理数据,并对比了非函数式编程和函数式编程在解决相同问题时的不同处理思路。文章还引入了decorator(修饰器),使得将普通函数管道化成为一件轻而易举的事情。文章内容深入浅出,让读者对函数式编程范式有了清晰明确的认知,同时引发了读者对在命令式编程语言中使用函数式编程风格或坚持使用函数式语言编程的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(49)

  • 最新
  • 精选
  • JZ
    整体设计面向对象,细节能用函数式就用函数式,算法相关过程式。稍微复杂点的场景想使用纯函数式,必然绕不过monad,hkt这样的概念。为了追求函数式风格而把程序写的艰深难懂,我觉得不是一件值得夸耀的事。
    2018-01-25
    1
    47
  • 硕根
    同样是业务代码的实现(抛开框架,中间件,基础设施的研发),前端更多的是声明式,函数式,反应式的编程,后端更多的是面向过程,事务,对象的编程,不知道皓叔怎么看这种差异的根源?
    2018-01-23
    6
    40
  • minghu6
    一直不太明白一点,函数式编程的特点之一就是就是immutable,这就是说函数总是应该返回新的值而不是修改旧的值。但是,如果要处理一个很大的list,深拷贝的代价是不是太大了? 进一步说,在编程解决实际问题的时候,往往需要依赖第三方的库。一方面大多数的第三方的库往往不是函数式的,引入后就被传染,变成了有状态的,可变的;另一方面,很难找到多少维护良好的通用编程方面的函数式的库。初步学习过common lisp,clojure,以及prolog和erlang,感觉除了这些语言都被局限在了“学术研究”,”语言玩具“,以及由高手组成的小团体的内部“秘密“使用。(erlang还好一些,但是被局限在了很小的领域)。 最后还是感觉,一门语言,语言特性再好,还是得有杀手级应用,就像支柱产业能带动一大量上下游的发展。就像clojure过去要是没有Storm,可能不会发展这么繁荣。 个人现在最常用的跟函数式风格有关的还是Java8的stream操作,对于理清思路,减少代码,提高开发效率来说非常有帮助。
    2018-02-14
    5
    24
  • wang
    在我看来,面向对象编程和函数式编程他们的关注点不一样,面向对象编程帮助你设计更复杂的应用程序,函数式编程帮助你简化更复杂的计算,我身为java后端,一直都是面向对象为主,函数式只是帮助我简化代码。
    2018-07-13
    22
  • 五柳
    有幸得以做自己喜欢的事情。一路走来,先是过程式,后是面向对象式,现在则是函数式。每次转变都感觉焕然一新,思路上了一级台阶。 函数式能帮我们更容易写出精简、易于复用的代码。优势耗子哥已经写的很详细了。我安利一下,学函数式,一定要了解一下 Elixir,会从新的角度理解编程。比如 Elixir 的 pipeline 的设计绝对会有所启发。 语言不止是工具。语言和编程范式极大影响了我们的思维。
    2018-02-13
    2
    14
  • zcom
    之前一直不是很理解函数式编程,直到我看了sicp,推荐朋友们有时间可以去看看。当然在工作中很少用过函数式编程,所以耗子哥最后的问题我答不上来……
    2018-01-23
    12
  • mingshun
    从过程式编程、面向对象编程、函数式编程一路走来,已经回不去了。对比机械化的过程式编程和层级结构复杂的面向对象编程,函数式编程能够很自然地描述现实世界。特别是用了 Elixir 之后,深感世界本应如此。其 pipeline 设计用起来比其他语言更灵活些,加上继承了 Erlang 的面向进程编程,可直接使用 OTP 开发分布式应用,语法更加人性化,还提供宏作为元编程手段,原生函数库也非常丰富。 当然也要承认 Elixir 还是很小众。要从底层更多地考虑机器运作的思维向更多地考虑现实问题的思维转换对大部分人来说有难度,毕竟需要转变的还有世界观,而不仅仅是换个编程语言那么简单。
    2018-05-13
    7
  • ryerh
    @硕根 我对这种现象的个人理解是,前端的业务特点是“单App、单节点、UI驱动”,后端的业务特点是“多Service、分布式、数据驱动”,业务特点上的不同导致彼此适应的范式不同。
    2018-01-25
    6
  • JK.Ryan
    很早就读过coolshell里那篇函数式编程,很受教,今天这篇又加了许多干货,很赞,特别是讲到分布式理论和我们微观处理,其实有异曲同工之处,很有共鸣~👍🏾
    2018-02-06
    5
  • 郎哲
    Erlang程序员 默默地走过 只提了一下Erlang…
    2018-01-23
    1
    5
收起评论
显示
设置
留言
49
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部