2020 Google开发者大会重磅开幕 了解详情

为什么函数式编程没有流行起来?

2009 年 3 月 02 日

函数式编程已经不是什么新概念了,而且在各个技术论坛和新闻网站上也时不时的挂起一阵函数式编程的旋风。但是对于很多编写应用程序的编程人员来说,函数式编程仍显得那么陌生和遥远。对此 Confusion 在 tweakblog.net 上发起了一场关于“为什么函数式编程语言没有流行起来”的大讨论。

Confusion 认为函数式编程语言之所以没有流行起来,原因是其文档及示例都显得过于复杂难懂,让人望而却步:

软件工程领域的一些权威对于函数编程(functional programming——FP)事实上不怎么流行深表遗憾。支持者这一观点的人通常责怪听众短视或其老板无能,认为不同意他们意见的人根本不懂函数式编程为何物。而这反过来却可能说明一点:他们没有给出恰当的解释。 我想限制 FP 语言被采用的实际原因是:真正吸引大家的是函数式编程语言的一些优点,但是这些优点并没有被很好地阐述和示例。同样,这些解释和样例在说服软件工程师方面显得非常失败,因为它们没有回答软件工程师们在日常工作中所关心的问题。

接着 Confusion 用一个有关定义 reduce 的例子进一步说明了这一点:

(reduce f x) nil = x
(reduce f x) (cons a l) = f a ((reduce f x) l) ……

这很抽象,多数人并不熟悉。可是,FP 语言的文档只包含了这类非常数学化的例子。难道没有人写一个用来证明 FP 强大功能的宠物店的例子吗?这才是我们大多数人的常规工作。

对于 Confusion 的这一看法,引来了众多读者的讨论,大家就这一问题纷纷发表了自己的看法。 RayNbow 对于 FP 例子过于抽象的看法就表达了不同意见:

斐波纳契数列(Fibonacci )的例子(还有阶乘)通常被用作说明语言语法的具体例子。因为函数式编程语言以函数为中心,还有什么更好的方法展示如何定义它们的么?你可以把斐波纳契数列和阶乘的例子看作函数世界的 Hello World。

Tubbie 认为 FP 的特长就在于计算方面,因此编写数据库或用户界面应用的程序员根本不需要使用它:

FP 支持者之所以展示计算例子,是因为 FP 擅长此道。问题是大多数程序员每天编写的大多数代码都是关于与数据库、用户界面等交互的,并不包含复杂的数学运算或算法。FP 语言是非常不同的的语言,如果只解决边界条件问题,就不需要学习它。

Dooievriend 非常赞同 Tubbie 的说法:

……我很喜欢函数式语言,它非常适合解决要解决复杂的运算问题。……但是关于用它来构建 GUI 并访问数据库,我没有任何思路。对我来说,只在复杂和经常变化的问题出现时,才会用到 FP,但它是嵌入到其他语言中使用。这是 FP 语言应被使用的方式,我至少知道 Mercury 是这么用的……

有不少人表示同意 Dooievriend 的这一说法,他们认为只有混合了命令式语言(imperative languages )与函数式语言(functional languages )才能做到两全其美。

就函数式语言没有很好的说明和例子这一说法,虽然 Morton 也表示同意,但是他并不认为 FP 没有流行起来:

……我没觉得 FP 不流行。我经常发现同事在代码中使用了函数模式,可是他们自己都没有意识到。现在也很难找到不支持 FP 的语言。在 Java 和.Net 都开始支持 FP 概念的时候,你们居然还担心 FP 不流行。

Alex 更是现身说法,说自己已经把函数式编程当作了“秘密武器”:

你的意思是还没人写出一篇能让人信服的说明函数编程好处的文章吗? …… 我和我的团队已经用 F#开发了一个稳定的、现实的、商用的业务应用,而且已经被大公司买走了。函数式编程最成功之处是,根据任务的特性,代码量可以减少 4 到 10 倍,对此我十分确信,因为我们用 F#重写了一些老代码,所写的代码也更加易于维护和扩展。 因此,它给了我们竞争优势。或许说服不了大多数人对我们来说是好事:),我们已经拥有这一秘密武器了。

虽然大家看法各不相同,但是有一点可以看得出来,函数式编程特长和优点是大家有目共睹的。你使用过函数式语言吗?对于函数式编程你有什么话要说呢?更多函数式编程信息请访问 InfoQ 中文网站的函数式编程专题

2009 年 3 月 02 日 23:31 4623
用户头像

发布了 150 篇内容, 共 35.2 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

数字货币监管当体现“中国之治”

CECBC区块链专委会

数字货币 CECBC 区块链技术 技术标准 准入和监管

架构师训练营第三周作业和小记

tuuezzy

架构师 极客大学架构师训练营

windows使用docker运行mysql等工具(一)windows安装docker

Java旅途

MySQL Docker

架构师训练营-作业3

进击的炮灰

架构师训练营 - Task Week 3

brave heart

极客大学架构师训练营

可读代码编写炸鸡二(下篇) - 命名的歧义

多选参数

代码 代码优化 代码组织 代码规范

小师妹学JVM之:java的字节码byte code简介

程序那些事

Java JVM Java 25 周年 bytecode 字节码

蟒周刊/426: DjangoCon US 2020 取消了

ZoomQuiet大妈

Python 大妈 蟒营® Weekly 蟒周刊

2020互联网公司端午节礼盒合集!你最中意哪一款?

Java小咖秀

互联网人 端午节

可读代码编写炸鸡二(上篇) - 命名的长度

多选参数

代码 代码组织 代码规范

新手村:最适合新手的 Redis 基础

多选参数

数据库 redis redis6.0.0

组合模式应用

yupi

第三周总结

晨光

架构师训练营 第三周 命题作业

RZC

HelloWorld.go

吐核hú

go 学习笔记 TraceLog

windows使用docker运行mysql等工具(二)安装运行mysql

Java旅途

MySQL Docker

一个汉字占几个字节你真的记住了吗?

Java旅途

架构师训练营 第三周 学习总结

RZC

架构师训练营-总结3

进击的炮灰

产品失败了,产品经理要不要承担责任?

涛哥

产品经理

区块链改变数字营销与广告市场

CECBC区块链专委会

区块链技术 广告业 精准投放 去中介 公开透明

良心推荐 | LeetCode(力扣),算法、数据结构的学习良伴

YoungZY

算法

rodert单排学习redis进阶【白银一】

JavaPub

Java nosql redis

架构师训练营 0 期第三周

Blink

面向对象的设计模式

WW

手写单例模式

yupi

极客大学架构师训练营 框架开发 第三次作业

John(易筋)

极客时间 设计模式 极客大学 极客大学架构师训练营 框架开发

第三周作业

晨光

面向对象设计模式课程小结

行下一首歌

极客大学架构师训练营

让你眼前一亮的 10 大 TS 项目

阿宝哥

JavaScript typescript Web 前端开发 开源项目

[架构师训练营] Week01 -学习总结

谭方敏

为什么函数式编程没有流行起来?-InfoQ