对函数式编程的误解

最近,我偶然看到了这样一篇文章:实用的纯函数式编程,里面谈到了函数式编程的优势。然而,作者的某些对函数式编程的思想认识却让我诧异:

成都创新互联公司长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为宜州企业提供专业的成都做网站、网站建设,宜州网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

“长期的处在命令式编程的环境世界里会让我们养成一种特定的顺序式的思考方式 … 而另一边,在纯函数的世界里,我们被强迫去思考的是如何变换数据。”

作者辩论说,按照代码序列来思考程序执行的思考方式是命令式编程语言固有的特征。文章中给出的***个“命令式”的例子是一个简单的Java循环:

1  int sum(int[] list) {
2	  int result = 0;
3	  for (int i : list)
4	    result += i;
5	  return result;
6	}

问题在于,我可以用纯函数编程语言写出相同形式的这个例子。当然,这代码跟Haskell语言代码不是很相似,但你要知道,Haskell并不是***的纯函数编程语言。例如,下面的这段代码:

1	int sum([int] list):
2	    result = 0
3	    for i in list:
4	        result = result + i
5	    return result

这是一个最严格意义上的纯函数(针对相同的输入永远都产生相同的输出,没有边际效应,而且具有亲系透彻性(referentially transparent)的。)这个函数是纯函数,这是因为复合数据结构(例如list,set,map等)具有值语义(value semantics),它们的行为跟基本数据结构(例如int)一样,而不是类似Java里的那种对数据的引用。

函数式风格

我认为作者在文章里把函数式语言和函数式风格(以函数为主要表达形式和计算方式)混淆了。没错,函数式风格更倾向于使用递归而不是循环。但这并不阻碍着函数式语言里使用循环结构。

关键还在于,很多命令式语言里支持函数式编程风格。换句话说,它不是函数式编程语言的专利(尽管它们更适合)。我们应该清楚的区分这两个概念,从而避免对函数式编程语言和命令式编程语言之间的不同产生混淆。

问题是有些人并不喜欢函数式风格。例如,我更喜欢使用循环(比如上面的sum()例子里),因为这样更加清晰,好理解。但是,对于有些东西(例如遍历一个列表),我认为用递归更好。这是我的风格。。问题是,人们通常会认为,那些具有命令式编程习惯的人应该完全的转换成函数式编程语言风格。但事实上不需要这样。一些主流的函数式编程语言故意给命令式编程制造障碍。如果事情能变的简单点,人们会慢慢的转变他们的编程习惯,而不需要形式上的强迫…

你对此有想法吗?

英文原文链接:A Misconception of Functional Programming?

译文链接:http://www.aqee.net/a-misconception-of-functional-programming/

分享名称:对函数式编程的误解
当前链接:http://www.zyruijie.cn/qtweb/news48/12948.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联