![[探讨]学习函数式编程的理由.doc_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/547f3964-9f40-40f9-ab0a-d7784973d44e/547f3964-9f40-40f9-ab0a-d7784973d44e1.gif)
![[探讨]学习函数式编程的理由.doc_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/547f3964-9f40-40f9-ab0a-d7784973d44e/547f3964-9f40-40f9-ab0a-d7784973d44e2.gif)
![[探讨]学习函数式编程的理由.doc_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/547f3964-9f40-40f9-ab0a-d7784973d44e/547f3964-9f40-40f9-ab0a-d7784973d44e3.gif)
![[探讨]学习函数式编程的理由.doc_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/547f3964-9f40-40f9-ab0a-d7784973d44e/547f3964-9f40-40f9-ab0a-d7784973d44e4.gif)
![[探讨]学习函数式编程的理由.doc_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/547f3964-9f40-40f9-ab0a-d7784973d44e/547f3964-9f40-40f9-ab0a-d7784973d44e5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、探讨学习函数式编程的理由2011-10-18 09:11 |3887 次阅读|来源:dave.fayr【已有0条评论】发表评论关键词:函数式编程I作者:Dave Favram I收藏这篇资讯导读:本文是从(Functional Programming Is Hard,Thais Why It's Good)这篇文章翻 译而来。文章内容如下:很奇怪不是,很少有人每天都使用函数式编程语言。如果你川Scala, Haskell, Erlang, F#或某,Lisp方言来编程,很可能没有公司会花钱聘你。这个行业里的绝犬部分人都是使用像Python,/Ruby,Java或C#等血向对象的编不旱语
2、言它们用起来很顺手。不错,伤;也许会偶然用到一两个“函数式语言特征”,例如 “block,”但人们不会去做函数式编程。/然而,很多年来,我们一直被教导说函数式编程语言很好很棒。我仍然记得当我第一次阅读ESR的著名的关于学习Lisp语言的论文时的困惑。也许大多数的人对Paul Graham的« Beating The Averages这篇文章更加熟悉:/使用Lisp开发使我们的开发周期迭代的如此 Z快,以至于有时当竞争对手在新闻发布会上推出他们的新功能一两天后,我们就能复制出同样的功能。'当报道产品发布的新闻记者打电话给我们时,我们的产品已经拥有了同样的功能特征。那些皈依函数式
3、编程的人中,一直常见的考虑是:学习这种新的、函数式的语言“对你有好处”;就像是某些人建议说每天 30分钟的健身房活动会“让你的身体健康” 一样。但这也同时暗示了这样做的难度和需要的付出。/ Lisp语言跟Haskelk Ocaml和Scala语言不同,被认 为是出了名的难学, 可以说是臭名昭著。文雅的人说这是Lisp语言的“深度&广度口的体现。不文雅的人说这是“意淫”或“玩弄学术”或简单的“没必要”。我认为,它的难度跟你对它熟不熟悉有关,而且,这种难度是一种重要指标显示:学习这样的一种语言会让你编程更有效率、能力更强。它给你的初次印象不友善我7岁时就开始编程,在漫长无聊的郊区夏季里,在
4、我祖父的计算机上瞎搞一气。我学了 BASIC,用 它在屏幕上画一个蹦跳的球。我学了Pascal,用它写了一个能通过 PC喇叭放音乐的程序。大概10岁时我学了 C语言,但遇到了一堵越不过去的墙,直到我上了高中。那就是:指针。即使不算这些该死的指针,我写、读、学习、练习中,同样遭遇无数的失败。我把祖?父的硬盘给毁掉了两次(一次屈意外),最后弄得不少次要自己重装操作系统。我失败 ,一遍遍的失败。也许你也有跟我相似的故事,也许是完全不同的一个。但我想,茅不多所有学过编程的人都有过遇比如“指优秀的程序要不断的练习和参到困难的经历。我们在学了一些基木知识后,必然会遇到一些公认的概念上的关口, 针”。很多计
5、算机科学教授会把指针描述为他们课程上的过滤网。如果你想成为一名 员,你必须要能理解指针。很少人能轻松的掌握它们。大多数人,包括我,则需 考例了来理解什么是指针、为什么它们很重要。这种艰难的努力过程不是偶然的,是一种几乎普遍的现彖。指针是一种非常强大和基础功能 的概 念。学会它能让你成为一名更好的程序员,能让你的思考更加形象化。即使你使用的语 言并不提供 指针这样的特征,但跟指针类似的数据结构和概念却随处可见。新奇事物一旦你学会了几种语言后,所有的语言都开始看起来都很相似。知道 Python的人学习Ruby可能不 会遇到太多的问题,知道 Java的人学习C#会感到很熟悉。不错,也有意外的地方。/
6、Ruby爱好者在学习 Python时会对它的comprehension感到吃惊,Java用户会对 C#里的 委派摸 不肴头脑。还是那旬话,如果你只膘一眼,它们都很相似。我可以打保票的说,如果你还不曾有过这样的认识,一旦你学了一种 Lisp语言,你会发现所有的Lisp变种都很相似。有人说,大部分人第一次使用 Haskell或Ocaml时都完全的不知所措。见鬼了,在 Haskell里,连 分号都跟别人不一样。这并不是语法的问题;Haskell和ML语言完全基于一种不同 的概念、-?种新的语言范式。你需要用不同的方式开发应用,不同的方式组织应用,不同的方式扩展应用。很多这样的新概念都具有不可思议的强
7、大力量。Haskell里的Monads是跟指针一样基础且 强大的概念(你很可能在不知道它叫什么的情况下就已经使用过它们了)。所以,跟学了 Java后再学C# 不一样,有志向学习函数式语言的人需要往何走的更远,去学习更加基础的概念后才能接下去学习。就像是完全再学习一次指许。并且,就像是当年我们刚开始学习编程一样,一些很大的概念看起来会让人迷惑茫然,让人沮丧,岚到你去攻克(以及失败)它们。吃下你的药丸,找到你的药剂师尽管不好学,但我坚信,学习这些函数式编程语言会在职业上对你有好处。我相信有些人读到这点会会眼睛翻起来问大看,很难想彖出这些monoids或monad会对他们在使用 Java或C#时有用
8、处。对我而言,我已经不惊奇于由于这样的思维而阻止他们学习函数式语言的现象;他们需要学习一种跟指针和递归一样基础的新概念。他们需要有一种只有专业人员在完成清晰的商业 bl标时才具有的耐心和斗志。很少人能在过了可塑的年龄后还受得了挫折一一一次又一次的挫折一一否则我们现在都早成专家了,不是吗? 还有更复杂的东西,有大量的语言和算法研究都是用函数式语言实施的(尤其是 Haskell)。你很容易会被这些不熟悉的概念 例如分类学理论,half-finished abstractions, 一些失败的研究一一弄的迷失方向。没有一个清晰的指导(比如由一个实用主义的作者写的一本好书),木来已经很困难的学习任务变
9、的更加可怕 这些叠加起来的复杂因素导致了不出意外的结果:很多人不情愿在函数式编程学习中投入时 间。很 容易理解这种不情愿,哦干嘛不把花在学习这些东西的时间用在实现什么东西上呢? ”但这种思路 也表明了你永远不愿意在任何新技术上浪费时间(只用白己熟悉的)。在一个像软 件技术这样口新 月异的产业里,我不认为这是正确的判断。眼见为实学习一种函数式编程语言最显而易见的好处是,你能学会这种类型语言中的函数式概念。它能帮助你的大脑,让它具有能非常清晰的思考和处理一些惊人的重大概念的能力。这并不是函数式编程具有魔法;备种语言和范式的出现都是为了应对某一特定类别的问题。函数式编程的杀手铜正是应对了当今世界上日
10、益增长的并行性编程和元数据编程趋势。例如,我们研究一个简化的、木地版木化的Google著名的MapReduce范例。用函数式方 式描述这种范例是不可思议的清晰简洁:? mapReducer data partitioner mapper reducer =? let partitions = partitioner data? in reduce reducer(map mapper partitions )让这样的代码支持并行计算或分布式并行计算是轻而易举的(对于木地并行计算,很多的功能包都支持"pmapR3 "preduce-' 只需要利用函数式语言的一些简单特
11、性)。像 maps,partitions, generators, streams, reductions, folds, 已以及 function chaining 等概念在各木中 的函 数式编程语言中都大同小异,所以,任何对Lisp, Haskell, OCaml,其至带点函数式 语言特征的语言Python和Ruby熟悉的人,都会很容易的理解这里面的思想精华。让我们花点时间考虑一下,如何用一种面向对彖的语言,以一种常见的面向对彖的模式来清楚的描述这种架构。至少你需要做的事情是定义用来描述mapper和reducer的声明。如果 你有好奇心,请试看用你喜欢的面向对象语言描述一个最小化的“面向
12、对象”的MapReduceo我发现那是非常罗嗦的。如果使用Java风格的语!它会像这样:interface Mapper B map(A input);interface Reducer Y reduce(X a, X b); ? abstract class MapReduce ? private Mapper mapper;? private Reducer reducer; ? public MapReduce(Mapper map, Reducer reduce) ?/ .? ? public run(SeqenceType data) ?/ .? ? 即使是没有加入循环逻辑,这种缺乏
13、函数式模式中常见的名词和动词的使用,使得 MapReduce这 种技术很难被定义。这种定义方式几乎是滑稽可笑的,但它能让你想到函数式概念。另外一个好例了是Scala语言如何利用完备的Java Fork/Join类库,把它轻松的集 成的H己的白有语法中。各有所求所以,我鼓励任何想进步的不旱序员:请考虑学习一种函数式语言。Haskell和OCaml都是极好的选择,F#和Erlang也相当的不错。它们部不好学,但也许这是个好事。努力弄清楚 你遇到的复杂的概 念,看看是否有其他人正在利用这些概念;经常的,你会在寻找这些不熟悉的概念的真正用意的时候实现思想上的突破。当你开始学的时候,请注意,不要过于在意
14、。就像其他任何需要你花时间和精力的事情一样,过度的在函数式编程上进行精力上的投资是很危险的。掉进了认知能力的陷阱后你的投资会血本无归。你很容易会忘掉世界上还有无数种计算模型,伤;更容易忘掉有多少种优秀的软件根本没有使用任何的函数式概念。学习的道路会越来越难走,但从另一方面说,在你口常的编程中,你会发现有越来越多的可以使用的重要概念和模型。对于这样紧凑的编程风格你会越来越适应,必然,你也会对如何 成为一名更好 的软件工程师有了新的认识。补充是我有不少校对这篇文章的人在看完文章后都问了我一个同样的问题:“听起来不错,大一卫,可应该学习那种语言呢?当然,这是他们给我出的难题我想,如果你是一个很有经验的程序员,这最能“应付”这个问题的答案是选一种符合你的需求的”。如果你需要在 JVM上工作,选择Scala或Clojure。如果你想能快速的开发大型 分布式软件 系统,选择 Erlang.如果你想要一种具有超强编译器的超能干活的语言,请选择Haskell或RCaml。如果你想要一种比 Ruby或Python更有能力的原型工具,选择 Scheme。请记住,我们在这里要做的这些目的是为了实际的技能和白我进步。如果你能腾出时间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 怎样培养孩子情绪洞察
- 2025年春初中地理七年级下册人教版教案设计 第九章第三节 第2课时
- 家庭探索角:动手实验你会吗
- 药企培训总结
- 孩子抗压能力差怎么破
- 制定市场适应策略的工作总结计划
- 创造性思维的工作路径计划
- 如何设计年度培训计划与预算方案
- 加强行业合作的实施方案计划
- 编辑工作总结汇报
- (二模)哈三中2025年高三学年第二次模拟考试语文试卷(含答案)
- 2025年湖南省长沙市中考一模道德与法治试卷(含答案)
- 2025年危险化学品企业安全生产执法检查重点事项指导目录
- 2024年继续教育公需课考试题目及答案
- DZ∕T 0033-2020 固体矿产地质勘查报告编写规范(正式版)
- 国测省测四年级劳动质量检测试卷
- 呼吸囊检测(课堂PPT)
- 无机化学第4版下册(吉大宋天佑)2019
- 药店聘书样板
- 中石化职称英语考试试卷(中级)
- 有一种爱叫严厉作文-关于爱的作文
评论
0/150
提交评论