InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

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

作者 宋玮 发布于 2009年3月2日

领域
架构 & 设计,
语言 & 开发
主题
语言 ,
Java ,
编程
标签
语言特性 ,
语言 ,
函数式编程

函数式编程已经不是什么新概念了,而且在各个技术论坛和新闻网站上也时不时的挂起一阵函数式编程的旋风。但是对于很多编写应用程序的编程人员来说,函数式编程仍显得那么陌生和遥远。对此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中文网站的函数式编程专题

宋玮 有多年软件开发经验,长期担任技术管理和项目管理工作,一直关心开源软件的发展动态以及软件过程和敏捷开发的实践探索。

了解一下函数式编程不错 发表人 张 龙 发表于
fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 典 刘 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 Cui Anders 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 典 刘 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 Cui Anders 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 典 刘 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 曹 云飞 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 典 刘 发表于
Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会. 发表人 Guo Xiaogang 发表于
就像Morton说的,不是没有流行起来,而是流行起来了你也没怎么发现 发表人 im Kevin 发表于
  1. 返回顶部

    了解一下函数式编程不错

    发表人 张 龙

    以前对这个基本没有什么概念,就像文中所说,平时打交道的依然还是数据库、界面等等,了解一下FP未尝不可。

  2. 返回顶部

    fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 典 刘

    我觉得不流行的原因是因为大多数程序员紧紧把编程语言当作吃饭的家伙, 能找到工作就行了, 不会去考虑语言本身的问题. 我认识的把编程当乐趣和爱好的人几乎都懂一些fp.

  3. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 Cui Anders

    这也许就是文中所说的“但是这些优点并没有被很好地阐述和示例”,大多数程序员仅仅把编程语言当作吃饭的家伙,那为什么不选择FP吃饭呢?

  4. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 典 刘

    因为历史原因, 命令语言已经成为主流了. 作为一个公司招聘程序员也不太可能特意去招聘fp程序员. 我的项目里面用fp还是我和一个朋友坚持 才用的.

  5. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 Cui Anders

    有道理。我也希望FP能流行起来,学习了一段时间F#,向很多人推荐过,遗憾的是没有做出Petshop这样的例子。不过年底发布的VS2010中已经包含了F#,这对于FP是个好消息。

  6. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 典 刘

    至少现在趋势是好的, 现在脚本语言开始流行 . 而流行的脚本语言都有fp的特性, 以及主流语言也加入fp特性 希望fp的优点能引起更夺人的关注.

  7. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 曹 云飞

    脚本语言容易推行fp,你们在项目里面是如何推行fp的?能详细介绍一下背景么?

  8. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 典 刘

    最关键的是写了一个demo. 然后和原来的方法对比, 的确降低了工作量. 当时用的是java和scheme (sisc-scheme.org/)结合的方式, java编写framework 用scheme编写具体的功能.

  9. 返回顶部

    Re: fp语言灵活性和开发效率都远胜于命令式的语言, 有切身体会.

    发表人 Guo Xiaogang

    请问有没有兴趣把您的例子给InfoQ写一篇文章?

  10. 返回顶部

    就像Morton说的,不是没有流行起来,而是流行起来了你也没怎么发现

    发表人 im Kevin

    其实纯粹的函数式编程对于现在大多数BS结构的应用来说是不现实的,但是函数式编程的很多思想已经融入了主流语言中了,很多时候我们用着,但是却没意识到自己正在使用函数式编程模式

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。