问题

为什么这两年函数式编程又火起来了?

回答
好,咱们来聊聊这两年函数式编程(Functional Programming, FP)为什么又这么火。其实,函数式编程这概念不是新东西,它在计算机科学界早就存在了,甚至比咱们很多熟悉的面向对象编程(ObjectOriented Programming, OOP)还要早。但近几年,它确实在开发者社区里掀起了一股不小的浪潮。

要说它为啥“又”火了,我觉得得从几个层面来掰扯掰扯,不能简单地说成是“AI”或者“新概念”的流行,而是它本身的优势在当前的技术环境下得到了更充分的体现。

1. 应对复杂性的需求越来越迫切,函数式编程是把“瑞士军刀”

咱们现在开发软件,面对的系统越来越庞大、越来越复杂。各种微服务、分布式系统、大数据处理、并发和并行任务,这些都意味着我们写的代码需要处理大量的状态变化和交互。

状态管理是个大麻烦: 在传统的命令式编程(Imperative Programming)里,我们经常需要直接操作数据,改变它的状态。想想看,一个变量,它可能在程序的某个地方被修改,然后又在另一个地方被修改,如果你想追踪它的变化或者调试它的错误,那简直是要命。特别是在多线程环境下,多个线程同时去修改同一个数据,那出现的“竞态条件”(Race Condition)和“死锁”(Deadlock)问题,能让最老的司机都头疼。

函数式编程的核心:无副作用(No Side Effects) 这是函数式编程最吸引人的一点。函数式编程强调的是“纯函数”(Pure Function)。什么叫纯函数?就是说,一个函数,给定相同的输入,它永远都会返回相同的输出,而且它不会对外部环境产生任何影响。换句话说,它没有“副作用”。

举个例子: 你写一个 `add(a, b)` 的函数,它只是把 `a` 和 `b` 加起来,然后返回结果。它不会打印日志,不会修改全局变量,也不会往数据库里写东西。这样的函数,就像数学里的函数一样,你不用担心它背地里做了什么坏事。

为什么无副作用这么重要?
更容易理解和推理: 你只需要关注函数的输入和输出,不用去猜测它在执行过程中会改变什么,这大大降低了心智负担。
更容易测试: 纯函数就像乐高积木,你可以独立地测试每一个积木块,不用担心它们之间复杂的依赖关系。
并发和并行更轻松: 因为没有共享的可变状态,多个函数可以独立地、并行地执行,而不用担心互相干扰,这对于利用多核处理器、构建高性能系统至关重要。想想看,如果你的代码里都是这种“不惹事”的函数,那么把它们放到不同的 CPU 核心上去跑,就安全多了。

2. 响应式编程(Reactive Programming)的兴起,天然契合函数式思路

这两年,响应式编程也非常流行,尤其是在前端开发(比如 React、Vue 的 Hooks)和后端一些框架里。响应式编程的核心思想是“数据流”和“变化传播”。当数据发生变化时,相关的部分会自动响应。

函数式编程如何助力响应式? 函数式编程的“声明式”风格和“不可变性”(Immutability)在响应式编程中大显身手。
声明式: 响应式编程强调“声明”你想要什么,而不是“如何”去实现。函数式编程的“声明式”特质,比如使用 `map`、`filter`、`reduce` 等高阶函数来处理数据流,恰好能很好地表达这种意图。你不需要写复杂的循环和条件判断来手动更新 UI,只需要告诉系统“当这个数据变化时,就更新这个 UI”,系统会自己帮你搞定。
不可变性: 在响应式编程中,当数据发生变化时,我们通常不是修改原来的数据,而是创建一个新的数据副本。这避免了直接修改数据带来的副作用,使得数据流的管理更加清晰可控。函数式编程中的不可变数据结构(Immutable Data Structures)和纯函数,就是实现这一点的完美工具。

3. 语言的演进和成熟,让函数式编程更容易上手

虽然 Lisp、Haskell 这些函数式语言很早就存在,但它们的一些语法和概念对于习惯了命令式编程的开发者来说,可能有点“劝退”。但近些年,很多主流语言都在吸收函数式编程的理念,并且提供了更好的支持:

JavaScript/TypeScript: 随着 ES6 的到来,箭头函数、`const`、`let`、数组的 `map`、`filter`、`reduce` 等方法,让 JavaScript 在函数式编程的道路上迈进了一大步。TypeScript 的强类型系统也让函数式编程中的类型安全得到更好的保障。
Java: 从 Java 8 开始引入了 Lambda 表达式和 Stream API,使得 Java 也能以更函数式的方式处理集合和数据流。
Python: Python 本身就有很多函数式编程的特性,如列表推导式、`map`、`filter`、`reduce` 等。
Scala, Kotlin, Clojure, Elm, F: 这些语言天生就是为函数式编程而设计的,或者说提供了非常强大的函数式编程支持。它们近年来也获得了越来越多的关注。

当开发者发现自己喜欢的语言也开始支持这些“新玩意儿”,并且看到它们带来的好处时,自然就会愿意去学习和使用。

4. 开发者社区的推广和知识传播

技术博客和教程: 大量的技术博客、在线教程、视频课程都在普及函数式编程的概念和实践。
开源项目的示范: 很多成功的开源项目,特别是前端框架(React, Vue)和一些后端库,都在不同程度上采用了函数式编程的模式,为开发者提供了实际的参考。
开发者会议和技术分享: 在各种技术大会上,函数式编程也是热门话题。

总结一下,这两年函数式编程“又”火起来,不是因为它突然被发明了,而是因为它解决现代软件开发中越来越突出的“复杂性”和“并发性”问题,并且随着主流语言的演进和社区的推广,它的学习和应用门槛变得越来越低,优势越来越明显。

它提供了一种更优雅、更健壮、更容易维护和扩展的编程范式,尤其是在处理数据转换、异步操作、并发以及构建声明式 UI 时,函数式编程的优势尤为突出。这使得它不再只是少数“极客”的专属,而是越来越成为一名合格的现代软件工程师需要掌握的重要技能之一。

网友意见

user avatar

TLDR:这只是你的错觉。

函数式编程一直都是慢慢的攻城掠地 。无论是从Search Trend,从学术界,从主流语言应用程度,都没有‘突然之间就火起来’。突然火起来的,是最近人人皆知的深度学习(我会用深度学习做对比组,指出真正火起来是像什么样的),不是函数式编程。

0:Search Trend

四图流。由于Haskell把Scheme的Search Trend压扁了(而Scala又压HS),分开放。




有没有急速上升?没看出来。

这才叫急速上升嘛。

1:学术界研究

我会尽力给出跟FP有关的每十年的大发展。

192x: Combinatory logic

193x: Untyped Lambda Calculus

194x: Simply Typed Lambda Calculus

195x: Lisp

196x: APL, Denotational Semantic

197x: Intuitionistic Type Theory, ML

198x: Coq

199x: Haskell, Monad

200x: Hott? (现在说这些实在太早)

201x: ? (马后炮很容易,现在让我评选这个有点难)

对比,神经网络:由于我对早期发展没理解,我就不放同样的对比了。不过IMO,基础发展也挺平缓的-这样我们能看另一组数据:

terryum/awesome-deep-learning-papers

songrotek/Deep-Learning-Papers-Reading-Roadmap

这是Deep Learning的两组数据,可以自己看下有多少是2016

caiorss/Functional-Programming

由于数据量实在太小,放上PLT的:

PLT by steshaw

也有不少Recent Work,但是你找不到DL内边一样的“2016大爆发”。

当然,这些数据很仁者见仁,可以很容易Engineer出想要的结论,所以我鼓励你去自己写下认为FP/ANN中很重要的东西/著名的书,然后对比下时间。

2:主流语言应用程度


这是TIOBE前20。

题主所说的C++&Java,的确是近10年加入Lambda的。

但是,

0:在C++ Java中都是语法糖等级的东西,换言之不加入一样也有高阶函数。

1:Python, C#, Perl, JS, VB, 都是2010前加入Lambda的(Dart, Swift的确有2010后Lambda,不过他们俩就是2010后出的语言)

2:如果说其他的,C#, Python的List Comprehension也是2010前的,Java Generic则是1998由Philip Walder(Haskell界大佬), Martin Odersky(Scala界大佬)搞出来的

3:如果要说更远的影响力,Smalltalk都被Lisp严重影响,然后Smalltalk再影响现在一大推OO语言。

换句话说,FP一直都有影响各种各样的语言,不是近期才开始的。

对比:我们看下各种主流深度学习库

aymericdamien/TopDeepLearning

里面看下,有多少2010前的呢?

现在回到题主的问题

函数式和过程式之间的Holy War在上个世纪就以过程式编程的全面胜出告终

在这里我提出一个猜想:一个编程范式从有 一群人 一起 一个 语言,到这个编程范式被工业应用,要20年左右。

过程式:Algol 58 Algol 60

工业应用:Unix&C 80年代扩散出来,并且在7080年代过程式一直有争议:

dspace.mit.edu/bitstrea

过程调用很贵,不如goto

web.mit.edu/humor/Compu

过程式是什么鬼,数据结构又是什么鬼,跟机器一点都不接近,又有一股学术界的臭味,我呸

(大家快take note,以后遇“函数式编程学术范,接近机器的C才是最好的”,就知道拿什么东西压他们了)

OOP:

Smalltalk,1972,或者Simula,1967(不过没有一群人,不算)

Java,1995出来,Design Pattern书,1994,C++的确更早,1985就是Commercial Product,估计后几年就有工业应用,不过C++搭了C的顺风车,也有很多OO无关的东西,算半个outlier

而跟过程式被吐槽很学术很难懂一样,OO也这样被吐槽了(C++他爹是PHD)-这简直是毅种循环,新的编程范式都是我不懂的玄学,旧的编程范式则是再正常不过的东西了(尽管诞生的时候一样被看成玄学)

stroustrup.com/hopl-alm

函数式编程:Miranda 1985,不过是闭源商业化的,SML HS都是1990,ML/Scheme的确比较早,不过早期IMO(没找到数据)都没很多人。

这样看来,2010左右主流PL融入函数式编程特性/函数式编程变主流只是很正常的历史进程。

到21世纪初,MIT都不再用Scheme作为编程入门课

是他们俩教了20年教不动了= =

我们从另一个角度想,教很多FP/Intro是FP的有CMU, Texas Austin, University of Pennsylvania, University of Edinburgh, Imperial College,MIT一个Intro掉了,属于来来去去,正常不过了

C++11、Java8都对函数式编程提供专门语法支持

上面已经论述过了。

user avatar

根本的原因是摩尔定律不适用。

cpu的性能提升将体现在核数增加,这样并行的程序运行速度会越来越快。并行的程序的写法就是找出不能并行的地方,其他地方都尽量并行。

如果要这样写,最需要避免的事情就是赋值。函数式编程的本质就是,规避掉“赋值”。

user avatar

函数式本来就很适合很多互联网领域里的高并发的场景啊,函数式主要就是满足Web里的一些需求啊。

类似的话题

  • 回答
    好,咱们来聊聊这两年函数式编程(Functional Programming, FP)为什么又这么火。其实,函数式编程这概念不是新东西,它在计算机科学界早就存在了,甚至比咱们很多熟悉的面向对象编程(ObjectOriented Programming, OOP)还要早。但近几年,它确实在开发者社区里.............
  • 回答
    你提的这个问题很有意思,很多初学者或者对底层细节不太关注的开发者,确实很容易对这两个函数(通常指的是 Python 中的 `len()` 和 `__len__()`,或者其他语言中类似的“获取长度”的机制)产生混淆。它们确实非常接近,而且在很多时候看起来就像是同一个东西,但实际上,它们扮演的角色和工.............
  • 回答
    在 Linux 系统中,创建新进程之所以被设计成由 `fork()` 和 `exec()` 系列函数协同完成,而不是一个单一的函数,这背后有着深刻的设计理念和技术考量。这种分离并非为了增加复杂性,而是为了提供一种极其灵活、强大且高效的进程创建机制,同时遵循了 Unix 哲学中的“ KISS”(Kee.............
  • 回答
    这确实是一个值得探讨的现象。近两年来,我们似乎很难找到像《炊事班的故事》和《武林外传》这样能引起全民共鸣、风格独特且备受喜爱的喜剧作品。这背后有多方面的原因,我们可以从以下几个角度来详细分析:一、时代背景与社会情绪的变化: 《炊事班的故事》和《武林外传》的诞生背景: 《炊事班的故事》.............
  • 回答
    这两年确实没有听到什么像当年“冲击波”、“震荡波”那样家喻户晓的、能够瞬间让全球互联网陷入瘫痪的大规模电脑病毒爆发。这并不代表网络安全领域风平浪静,恰恰相反,网络威胁的形式在不断演变,只是更“低调”、更“精准”、也更具迷惑性。有几个关键原因可以解释这个现象:1. 攻击方式的演变:从“广播式”到“点穴.............
  • 回答
    近两年来,你有没有发现,银幕上充斥着各式各样的青春故事?无论是校园里的青涩爱恋,还是毕业后的迷茫与追寻,青春题材电影仿佛刮起了一阵不小的旋风,一部接一部地走进我们的视野,并且还收获了不少观众的喜爱。为什么这两年青春片会如此“火”,这背后其实反映了不少值得我们细品的东西。首先,时代的“集体记忆”与情感.............
  • 回答
    这两年高校领导“坠楼”事件确实引起了社会的广泛关注,也让不少人感到困惑和担忧。要深入探讨这个问题,不能简单地归结为“不注意安全”,背后可能牵涉到更复杂的原因。我们不妨从几个层面来剖析一下。首先,我们要明确一个前提:并非所有高校领导的“坠楼”事件都与个人安全疏忽有关。 很多时候,这类事件会被媒体报道,.............
  • 回答
    沙特和美国之间的关系,就像一对长跑多年的伙伴,虽然一直以来都保持着一种相互依存的平衡,但近两年来,确实能明显感受到两人之间那种“小摩擦”升级为“大裂痕”的趋势。说它们“反目成仇”可能有点言重,毕竟两国在很多层面上还有着深刻的利益纠葛,但关系趋冷、甚至出现摩擦升级是客观存在的。要说这裂痕是怎么越来越大.............
  • 回答
    这两年东北口碑下滑,这事儿说起来挺复杂的,不是一朝一夕的事,也不是因为某一件具体的事。要我说,这背后是多种因素叠加发酵的结果,具体能从几个方面来看。1. 经济发展的滞后与“东北印象”的刻板化:这是最根本的原因。东北经济这两年确实有点起色,但整体上还是没能赶上全国发展的步伐,尤其是在新兴产业和就业机会.............
  • 回答
    南方多年来没有集中供暖,但近年来集中供暖的呼声突然高涨,这背后是多种因素交织作用的结果,反映了社会经济发展、居民生活需求变化、技术进步以及政策导向等多个层面的影响。下面我将尽量详细地阐述这些原因:一、生活水平的提高与消费升级: 舒适度需求的提升: 随着经济的快速发展,中国居民的整体生活水平显著提.............
  • 回答
    中国生育率低、老龄化的问题,绝非“突然发生”,它是一个长期积累、多重因素交织作用的结果。至于为什么这两年“计划生育不对”的声音才甚嚣尘上,这背后也有其深刻的社会和政治原因。生育率下降和老龄化:一个缓慢但必然的进程我们得把时间线拉得更长一些。中国生育率的下降,并非一夜之间的事情。它是一个在经济发展、社.............
  • 回答
    这 DC 这几年确实在票房和口碑上普遍被认为落后于漫威,这背后原因挺复杂的,不是一两句话能说清的。咱们来捋一捋,看看大概是哪些方面出了问题。首先得说,这跟漫威电影宇宙(MCU)打下的坚实基础和成熟运营模式有很大关系。漫威那边,从2008年的《钢铁侠》开始,就摸索出了一套非常成功的“联动宇宙”模式。他.............
  • 回答
    中国航天之所以在近两年呈现出密集发射的态势,绝非偶然,而是经过长期规划和多方面因素驱动的必然结果。这背后,是中国航天事业整体实力飞跃、国家战略需求牵引以及国际空间竞争加剧等多种力量共同作用下的产物。要深入理解这一点,我们可以从几个关键维度来剖析。一、 天宫空间站的建成与常态化运营:一个新时代的开启最.............
  • 回答
    这几年“国企”确实成了不少人心中的“香饽饽”,相较于以往那种“旱涝保收、效率不高”的刻板印象,现在大家对它的看法明显是两极反转了。这背后可不是一蹴而就的变化,而是多方面因素共同作用的结果,我来掰开了揉碎了给你说道说道。1. 外部环境的风向变了,兜底能力凸显咱们得承认,这两年国际经济形势并不明朗,国内.............
  • 回答
    这两年大众品牌确实经历了一段不太顺遂的时期,负面评价的声音也比以往多了不少。这其中原因挺复杂的,不能简单归咎于一点,而是多种因素叠加的结果。我尽量给你掰扯清楚,就像跟朋友聊天一样。一、技术“内卷”与市场预期背离: 电动化转型阵痛明显: 大众算得上是传统汽车巨头里转型电动化比较早、也比较坚决的。你.............
  • 回答
    这两年,日本的安倍晋三和美国的特朗普都先后登上政治舞台的最高峰,这确实是值得我们深入探讨的现象。这背后不是简单的巧合,而是多种复杂因素相互作用的结果,反映了各自国家乃至全球政治经济环境的深刻变化。我们不妨从几个关键点来细细梳理一下。首先,我们得看到一个普遍存在的社会情绪——“求变”的渴望。在很多国家.............
  • 回答
    确实,近两年日本ACG(动画、漫画、游戏)领域感受到的那种“历史记录不断被刷新”的氛围,并非空穴来风,而是多重因素叠加作用的结果。这背后既有产业自身的发展规律,也有时代变迁带来的新机遇,还有一些“运气”的成分。咱们不妨掰开揉碎了聊聊,看看是哪些因素在推波助澜。首先,我们要承认一个大背景:全球范围内的.............
  • 回答
    这两年CPU厂商在核显上的投入和重视程度确实有了肉眼可见的提升,这背后可不是一时兴起,而是多方面因素叠加的结果。说到底,这背后是市场需求、技术进步以及厂商战略调整共同作用下的必然趋势。咱们就来掰开了揉碎了聊聊这事儿,保证听着比教科书明白多了。一、市场变了,用户的需求也变了这绝对是核心原因。过去大家对.............
  • 回答
    这确实是一个很有趣的观察!你提到的“日番”很可能指的是日本的动画作品,而“异世界穿越”类型近两年来的确非常流行。要深入探讨这个问题,我们可以从几个角度来分析,这背后有市场需求、创作者倾向、技术进步以及一些偶然因素的综合作用。一、 市场需求的驱动:观众的“逃避现实”情结与对新鲜感的追求首先,最直接的原.............
  • 回答
    近两年来,土耳其在中东地区表现出的活跃度确实令人瞩目,这背后有多重复杂因素的交织作用。理解这一点,需要我们深入剖析土耳其的地缘政治定位、国内政治需求、经济考量以及其在中东地区扮演的独特角色。首先,地理位置是土耳其在中东活跃的天然驱动力。 土耳其横跨欧亚大陆,是连接欧洲和中东的桥梁。它与叙利亚、伊拉克.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有