软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

18 | 函数式编程之组合性:函数式编程为什么如此吸引人?

你好!我是郑晔。
从上一讲开始,我们开启了函数式编程之旅,相信你已经对函数式编程有了一个初步的认识。函数式编程是一种以函数为编程元素的编程范式。但是,如果只有函数这一样东西,即使是说出花来,也没有什么特别的地方。
之前我讲过,GC 来自于函数式编程,Lambda 也来自于函数式编程。此外,在 Java 8 增加的对函数式编程的处理中,流(Stream)的概念也从函数式编程中来,Optional 也和函数式编程中的一些概念有着紧密的联系。由此可见,函数式编程给我们提供了许多优秀的内容。
接下来,我们来讲讲函数式编程在设计上对我们帮助最大的两个特性:组合性和不变性。
首先,我们来讨论一下组合性,看看函数式编程为什么能够如此吸引人。

组合行为的高阶函数

在函数式编程中,有一类比较特殊的函数,它们可以接收函数作为输入,或者返回一个函数作为输出。这种函数叫做高阶函数(High-order function)。
听上去稍微有点复杂,如果我们回想一下高中数学里有一个复合函数的概念,也就是 f(g(x)) ,把一个函数和另一个函数组合起来,这么一类比,是不是就好接受一点了。
那么,高阶函数有什么用呢?它的一个重要作用在于,我们可以用它去做行为的组合。我们再来回顾一下上一讲写过的一段代码:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

函数式编程以函数为编程元素的编程范式,具有组合性和不变性两大特点。本文重点讨论了组合性,指出函数式编程中的高阶函数能够接收函数作为输入或返回函数作为输出,从而实现行为的组合。这种设计方式使得程序库的提供者不再需要提供完整功能,而是提供构造块,使用者可以根据需要自由组合,创造出新的模型。文章还提到了函数式编程社区逐步叠加构建模型的思想,以及构建一门LISP语言的案例,展示了函数式编程的思想和应用。函数式编程的组合性设计方式能够让模型逐层叠加,体现了一种好的设计方式。另外,文章还介绍了列表转换的思维,通过map、filter和reduce等基础转换模式,展示了函数式编程在数据处理方面的优势。此外,文章还探讨了面向对象和函数式编程的组合,指出两者的组合方式不同,但可以相互补充。总的来说,函数式编程的组合性和列表转换思维为软件开发提供了新的思路和方法,能够带来极大的智力愉悦。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • Being
    大概就是通过拆解、组合的重构手法,减少for的圈复杂度吧,for嵌套多了确实头大。今天函数式编程的组合再次给了我启发,当我要写for循环的时候,就提醒自己可否用列表转化的思维尝试下。

    作者回复: 有这一点启发,足矣!

    2020-07-07
    24
  • J.D.Chi
    之前看了一本书叫《函数式编程思维》,里面说了一个点,就是用函数式就是把一些事情交给编程语言去做,程序员不用去思考怎么实现,就像在list里的查找,我不用去考虑遍历的方法,只要给个条件,返回我要的结果就行了。

    作者回复: 这就是声明式编程,说明做什么,不必关心怎么做。

    2020-07-06
    2
    21
  • Jxin
    将单纯结构化的功能代码,重构成了领域模型+应用层引用的方式。属于领域模型的功能内敛,应用层对这些功能的复杂性无感。同时在多个应用层间,该领域模型的功能都是可以复用的,不管是代码去重还是复用性都有不错的提高。(让代码整洁合理,不确定是不是智力上的愉悦,但真的很爽。但不好的点是,烂代码的容忍度越来越差)

    作者回复: 哈哈,烂代码容忍度越来越差,这不就是你水平提高了吗?

    2020-07-06
    3
    7
  • sam
    map、filter 和 reduce 是编程语言的特性吧,在一些语言或语言的版本中不一定能看到?

    作者回复: 它们是一种常见的高阶函数。没有提供实现的语言也可以自己写一个,参考Guava中的实现。

    2020-07-07
    4
  • 阳仔
    函数式编程其实也是一种对传统编程思想的转变 面向对象编程是对系统结构的组合,函数式编程是对接口的组合 这些编码规则或者范式也是对“分离关注点”的深刻理解之后抽象出来的标准模式 如果同样问题经常出现,那么标准的解决方案也会出现

    作者回复: 这个理解没有问题!

    2020-07-06
    3
  • 愿凌飞
    我在看一些源码的过程,发现最让我惊叹的是抽象能力和基于抽象做出的解耦。无论是从函数编程还是对象编程,想做一个 ”抗用“的项目,设计的时候必须都要做好抽象和基础抽象做出的解耦。做出来的话调度性很高,扩展性极强,解决问题更加容易。此时我发现了它是如此之美。我一直在想,我怎么才会做出这样的项目,我想我在这里找到了答案。希望有一天可以拥有这样的设计能力。

    作者回复: 加油加油!

    2022-05-10
    2
  • 阿姆斯壮
    立马用上校长教的方法。组合函数加柯理化。被同事说俺在炫技。。。这算是一种凡尔赛么。

    作者回复: 哈哈,凡尔赛。

    2021-08-13
    2
    2
  • Numbpad1
    MapReduce真的是很棒的思想,使用这种方式写出来的代码更具人类的思维模式。

    作者回复: 遗憾的是,很多程序员不理解

    2021-10-03
    1
  • 請問老師:"函數的接口設計" 指的是不是設計高階函數, 設計組合函數(達到某種功能)的函數?比如說設計出像是 filter, map, reduce 這種函數?

    作者回复: 你可以理解成就是普通的函数接口,高阶函数只不过是传入的是一个函数对象而已。

    2020-12-08
    1
  • Geek_2e6a7e
    函数式编程算是比较了解了,建议作者讲讲函数式学习的难点和思维方式,通过什么刻意练习提高?

    作者回复: 你觉得函数式编程有哪些问题需要进一步讲解呢?后面关于函数式编程还会有一些内容,等讲完了,你看看还需要补充点什么。

    2020-07-06
    3
    1
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部