为什么即使短期内不打算改变语言也应该关心函数式编程

到目前为止,在本系列的每期文章中,我都说明了为什么理解函数式编程非常重要。但是,有些原因是在多期文章中进行说明的,只有在综合思路的更大背景中,才可以完全了解这些原因。在本期文章中,我会探讨函数式编程方兴未艾的所有原因,并综合前几期文章中的一些个人经验教训。

在计算机科学短短的发展历史中,技术的主流有时会产生分支,包括实用分支和学术分支。20 世纪 90 年代的 4GL(第四代语言)是一个实用分支,而函数式编程是来自学术界的一个示例。每隔一段时间,都会有一些分支加入主流,函数式编程目前也是这种情况。函数式语言不仅在 JVM 上刚刚崭露头脚(其中两个最有趣的新语言是 ">Scala 和 C++lojure),在 .NET 平台上也是才开始得到应用,在 .NET 平台上,F# 是头等公民。为什么所有平台都如此欢迎函数式编程?答案是,随着时间的推移,随着运行时都要能够处理更多的繁忙工作,开发人员已经能够将日常任务的更多控制权割让给它们。

割让控制权

在 20 世纪 80 年代初,在我上大学的时候,我们使用一个被称为 Pecan Pascal 的开发环境。其独特的特性是,相同的 Pascal 代码可以在 Apple II 或 IBM PC 上运行。Pecan 工程师使用某个称为 “字节码” 的神秘东西实现了这一壮举。开发人员将 Pascal 代码编译为 “字节码”,它可以在每个平台本地编写的 “虚拟机” 上运行。这是一个可怕的体验!所生成的代码慢得让人痛苦,甚至简单的类赋值也非常缓慢。当时的硬件还没有准备好迎接这个挑战。

在发布 Pecan Pascal 之后的十年,Sun 发布了 Java,Java 使用了相同的架构,对于 20 世纪 90 年代中期的硬件环境,运行该代码显得有些紧张,但最终取得了成功。Java 还增加了其他开发人员友好的特性,如自动垃圾收集。使用过像 C++ 这样的语言之后,我再也不想在没有垃圾收集的语言中编写代码。我宁愿花将时间花在更高层次上的抽象上,思考解决复杂业务问题的方法,也不愿意在内存管理等复杂的管道问题上浪费时间。

Java 缓解了我们与内存管理的交互;函数式编程语言使我们能够用高层次的抽象取代其他核心构建块,并更注重结果而不是步骤。

结果比步骤更重要

函数式编程的特点之一是存在强大的抽象,它隐藏了许多日常操作的细节(比如迭代)。我在本系列文章中一直使用的一个示例是数字分类:确定某个数字是 perfect、abundant 还是 deficient。清单 1 中显示的 Java 实现可以解决这个问题:

清单 1. 自带缓存总数的 Java 数字分类器

import static java.lang.Math.sqrt;public class ImpNumberClassifier { private Set<Integer> _factors; private int _number; private int _sum; public ImpNumberClassifier(int number) { _number = number; _factors = new HashSet<Integer>(); _factors.add(1); _factors.add(_number); _sum = 0; } private boolean isFactor(int factor) { return _number % factor == 0; } private void calculateFactors() { for (int i = 1; i <= sqrt(_number) + 1; i++) if (isFactor(i)) addFactor(i); } private void addFactor(int factor) { _factors.add(factor); _factors.add(_number / factor); } private void sumFactors() { calculateFactors(); for (int i : _factors) _sum += i; } private int getSum() { if (_sum == 0) sumFactors(); return _sum; } public boolean isPerfect() { return getSum() - _number == _number; } public boolean isAbundant() { return getSum() - _number > _number; } public boolean isDeficient() { return getSum() - _number < _number; }}

清单 1 中的代码是典型的 Java 代码,它使用迭代来确定和汇总系数。在使用函数式编程语言时,开发人员很少关心细节(比如迭代,由 calculateFactors() 使用)和转换(比如汇总一个列表,该列表由 sumFactors() 使用),宁愿将这些细节留给高阶函数和粗粒度抽象。

时间: 2024-10-14 18:42:05

为什么即使短期内不打算改变语言也应该关心函数式编程的相关文章

天线视频变脸OpenV影像社区 短期内不打算盈利

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 凤凰网科技讯 5月17日晚间消息,沉寂了半年有余的天线视频高层首次面对媒体,天线视频已经转身为OpenV影像社区. 公司总裁彭涛透露,现在新公司已经与原先的"天线视频"没有任何关系了,是一个全新的新公司."天线视频"中文品牌已经彻底弃用.转型后,公司并不打算在短期内盈利,盈利时间预期可能在3年左右. 在

路易斯•冯•安打算利用语言学习平台改变生活

12年前,路易斯•冯•安(Luis von Ahn)用验证码(CAPTHCA)改变了整个互联网:12年后,他打算利用语言学习平台Duolingo改变更多人的生活. 路易斯今年34岁,毕业于美国卡内基梅隆大学.早在2002年,他和导师一起发明了验证码,极大打击了垃圾邮件和恶意注册行为:随后,他又启动了reCAPTHCA项目,希望通过验证码推动古籍.过刊的电子化:如今,他把所有精力投入到了Duolingo中. Duolingo(中文译名为"多邻国")是一个"寓教于乐"的

在不改变语言的前提下如何推进Java的不断演进

James Gosling在"The Feel of Java"中说到: Java是一种蓝领语言,它并非博士的论文素材而是用于完成工作的语言.各式各样的程序员都非常熟 悉Java,因为在设计Java之初我就坚持这样一种观点:选择久经考验的东西而非仅仅是听起来很美. Java所获得的巨大成功证明了这种设计方式是正确的,但如果这依然是当今Java的重要目标的话,那 么其结果就是语言的演进将变得非常缓慢.除此以外,Java是一门成熟.使用广泛的语言这个事实也将导 致其演进过程充满了困难.一方

Ovum观点:RAN厂商短期内依然处境艰难

Ovum表示,基站供应商(RAN供应商)市场是市场整合的一个典型例子.随着移动运营商的合并,以及收入增长陷入困境,RAN供应商不得不拼命抓住越来越有限的市场机会.这自然也导致了RAN供应商市场的整合,包括北电.摩托罗拉和阿尔卡特朗讯在内的著名厂商都已被竞争对手收购.市场整合也导致了极高的市场集中度:2015年,三家厂商(爱立信.诺基亚和华为)占据了市场总收入82%的份额.排在其后的三大厂商中兴通讯.三星和NEC则在争抢剩余的18%. Ovum智能网络首席分析师Daryl Schoolar表示,R

团购网旋风闯进旅游市场 短期内盈利尚有难度

从2009年底开始,团购网站在互联网上掀起了一股股强劲的旋风,在这些威力巨大旋风的影响之下,似乎产品一旦傍上"团购",就会立刻变得势不可挡, 旅游产品也不例外.2011年春运期间,春运市场就闯进了陌生的面孔,一些如搜旅团.团程网.橙团网等专门的旅游团购网站纷纷成立.这些旅游团购网站每天都会推出一个或几个团购旅游产品,企图在这股全民大潮中分得一杯羹. 旅游市场吹起"团购风" 近两年,随着电子商务的发展,团购渐成热门消费方式.而"旅游团购旋风"已成为

谷歌高管称Android和Chrome短期内不会融合

新浪科技讯 http://www.aliyun.com/zixun/aggregation/17197.html">北京时间2月17日早间消息,谷歌Chrome及应用高级副总裁桑达尔·皮恰伊(Sundar Pichai)周四在参加2012年高盛科技及互联网行业会议时表示,Chrome未来将向移动设备拓展,不过短期内Chrome和Android不太可能融合. 皮恰伊表示,移动互联网仍处于发展初期,而这一市场将在未来3到5年内快速发展.对于网络浏览器的创新,皮恰伊表示,尽管浏览器已出现了15年

商业周刊:Web2.0网站短期内不会上市

导语:<商业周刊>3月6日刊登分析文章指出,风险投资商和金融投资商都在迫切等待Web 2.0网站的上市,然而种种迹象表明,以Facebook.LinkedIn和Slide为代表的Web 2.0网站在短期内都不会上市.美国经济萧条将对互联网市场造成深远的影响. 不要着急 慢慢来 在网络繁荣时期,年销售额近1亿美元.月新增用户达100万的互联网公司都可能会选择上市.不过,专业的社交网站LinkedIn虽然已经满足了这样的条件,但它并没有上市的打算.相反,LinkedIn一直恪守着网站IPO的新格言

优酷土豆合并后短期内有部分原有客户流失

摘要: 土豆网自2011年第三季度上市以来的营收状况 优酷土豆(NYSE:YOKU)今日迎来合并以后的首份财报.财报显示,优酷土豆第三季度总净营收为人民币5.022亿元(约合7990万美元),其中来自于优酷 土豆网自2011年第三季度上市以来的营收状况 优酷土豆(NYSE:YOKU)今日迎来合并以后的首份财报.财报显示,优酷土豆第三季度总净营收为人民币5.022亿元(约合7990万美元),其中来自于优酷的净营收为人民币4.835亿元(约合7690万美元),总营收同比增84%,总净亏损1460万美

国美炮轰苏宁线上线下同价:短期内做不到

苏宁的线上线下同价政策遭到老对手国美的强烈抨击. 国美总裁王俊洲在接受新浪科技等媒体专访时称,苏宁的这种模式不符合产业现状,由于零售商在商品定价权方面的乏力,同价在只能起到宣传作用,短期内无法做到. 线上线下同价是苏宁集团提出一种零售新思路,苏宁宣布从今年6月8日起,全国所有苏宁门店.乐购仕门店销售的所有商品将与苏宁易购实现同品同价,这是全国首例大型零售商全面推行线上线下同价. 目前实体零售 普遍存在周末和假日促销现象,造成周中周末.平时假日,价格不等.消费不均.销售不平衡现象.苏宁方面认为,线