GMTC全球大前端技术大会聚焦前端、移动、AI应用等领域15个热门专题方向,购票立减¥960 了解详情
写点什么

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

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:314746
用户头像

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

关注

评论

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

基于阿里云容器的CI/CD落地实践

LorraineLiu

阿里云 k8s Helm jenkins CI/CD

API生态的发展与机遇:从5000组数据看中国API生态与开发者现状

华为云开发者社区

华为 API

来自阿里面试官的Java面试连珠炮,让你自由发挥你能撑到哪一步?

Java架构之路

Java 程序员 架构 面试 编程语言

一文读懂GaussDB(openGauss) 的六大关键技术特性

华为云开发者社区

数据库 数据 存储

【JSRC小课堂】Web安全专题(一)认证缺失和认证缺陷漏洞

京东科技开发者

WEB安全

云原生时代 容器持久化存储的最佳方式是什么?

京东科技开发者

数据库 云存储

云开发·多次订阅一次性订阅消息后定时发送

Yukun

微信小程序 小程序云开发 消息推送 订阅消息

数字货币钱包开发,去中心化钱包源码搭建

135深圳3055源中瑞8032

WebSocket-技术专题-服务器端消息推送

李浩宇/Alex

uni-app支持PC宽屏适配

崔红保

uni-app 前端框架

程序员不愿意说的秘密!Java进阶架构师必看:架构完美设计+程序员三门课+架构修炼之道

Java架构追梦

大企程序员亲身经历告诉你,CRM系统,自己的才是最好的

Learun

敏捷开发

USDT支付入金系统开发搭建,跨境USDT支付系统开发

135深圳3055源中瑞8032

架构师训练营第六周作业

Geek_4c1353

「深度解析」告诉你如何选择容器存储

焱融科技

Kubernetes 云原生 焱融科技 容器存储 分布式文件存储

个人计算机、工作站、服务器的主要区别

德胜网络-阳

我服了,难倒无数程序员的源码面试,就这样被轻轻松松讲透彻

小Q

Java 学习 源码 架构 面试

合约一键智能跟单软件,跟单平台开发

135深圳3055源中瑞8032

anyRTC与京东智联云市场达成战略合作,携手音视频平台

anyRTC开发者

ios 音视频 WebRTC RTC 安卓

搜狗搜索或成为企鹅号流量入口:腾讯欲实现自己的流量闭环

石头IT视角

MySql从青铜到王者晋级之路,阿里大牛经验总结让牛少走弯路!

Java架构之路

Java 程序员 架构 面试 编程语言

.NET可视化权限功能界面设计

力软.net/java开发平台

.net 可视化 权限

求职时这样回答问题你就输了!来自IT类面试官视角的深度解读

华为云开发者社区

面试 软件开发

分布式文件存储QoS硬核黑科技,真香

焱融科技

高性能 存储 HPC 分布式文件存储 QoS

爬虫“学前班”,记住这些不踩坑!

华为云开发者社区

爬虫 数据 搜索

以A.I.之力打破方言沟通障碍 科大讯飞重磅发布智慧翻译系统

Talk A.I.

小程序云开发实战:从0搭建科技爱好者周刊小程序

薛定喵君

微信小程序 小程序云开发 云开发

最近程序员频繁被抓,如何避免面向监狱编程!?

Java架构师迁哥

如何生成 Flink 作业的交互式火焰图?

Apache Flink

flink

Vidyo的技术特点都有哪些?

dwqcmo

音视频会议 集成架构 解决方案 智能硬件

接口测试工具

测试人生路

接口文档 接口测试

大数据技术升级脉络及认知陷阱

大数据技术升级脉络及认知陷阱

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