Why functional languages?
我在这里看到很多关于函数语言和东西的讨论。为什么你要用一种语言而不是"传统"语言?他们做得更好的是什么?他们在干什么?理想的函数式编程应用是什么?
功能语言使用的范例不同于命令式语言和面向对象语言。它们使用无副作用函数作为语言中的基本构建块。这使得很多事情变得更加困难(或者在大多数情况下,与人们习惯的不同)。
函数编程的最大优点之一是无副作用函数的执行顺序并不重要。例如,在Erlang中,这用于以非常透明的方式启用并发性。因为函数语言中的函数与数学函数非常相似,所以很容易将它们转换成函数语言。在某些情况下,这可以使代码更具可读性。
传统上,函数式编程的一大缺点是缺乏副作用。在没有IO的情况下编写有用的软件是非常困难的,但是在没有功能副作用的情况下,IO很难实现。因此,大多数人从函数式编程中得到的东西从来没有比从单个输入中计算单个输出多过。在现代混合范式语言中,如f或scala,这更容易。
许多现代语言都有来自函数式编程语言的元素。C 3.0有很多函数式编程特性,您也可以在Python中进行函数式编程。我认为函数式编程流行的原因主要有两个原因:并发性在正常编程中成为一个真正的问题,因为我们越来越多的多处理器计算机;语言越来越容易访问。
我认为关于编程"流行"的功能方法没有任何问题,因为它已经被使用了大约40年(作为一种编程风格)。每当OO程序员编写有利于不可变对象的干净代码时,该代码就借用了函数概念。
然而,如今,执行功能风格的语言得到了大量的虚拟墨水,这些语言是否会在未来成为主流是一个悬而未决的问题。我自己的怀疑是混合的多范式语言,如scala或ocaml可能会以纯OO语言(smalltalk、beta等)影响主流编程的方式主导"纯粹"功能语言,但最终并没有成为最广泛使用的符号。
最后,我忍不住指出,您对re-fp的评论与我多年前从过程程序员那里听到的评论非常相似:
- (神话,imho)"普通"程序员不理解它。
- 它没有被广泛教授。
- 任何可以用它编写的程序都可以用当前技术的另一种方式编写。
正如图形用户界面和"作为业务模型的代码"是帮助OO变得更受欢迎的概念一样,我相信增加对不可变和更简单(大规模)并行的使用将帮助更多的程序员看到功能方法所带来的好处。但正如我们在过去50年左右的时间里所学到的,构成了整个数字计算机编程历史,我认为我们还有很多东西要学。二十年后,程序员将惊奇地回顾我们当前使用的工具的原始性质,包括现在流行的OO和FP语言。
对我来说,主要的优点是它固有的并行性,特别是当我们现在从更多的兆赫向越来越多的核心移动时。
我不认为它会成为下一个编程范式,完全取代OO类型的方法,但我认为我们会达到这样的目标:要么用函数语言编写一些代码,要么我们的通用语言将增长到包含更多函数结构。
即使你从未专业地使用过函数语言,理解函数编程也会使你成为更好的开发人员。它将为您提供一个关于代码和编程的新视角。
我说没有理由不去学。
我认为那些能够很好地混合函数式和命令式风格的语言是最有趣的,并且最有可能成功。
我总是对下一件大事持怀疑态度。很多时候,下一件大事是纯粹的历史事故,无论技术是否好,在正确的时间,在正确的地点。实例:C++,TCL/TK,Perl。所有有缺陷的技术,都非常成功,因为人们认为它们要么解决了当时的问题,要么几乎与根深蒂固的标准相同,要么两者兼而有之。函数式编程也许的确很棒,但这并不意味着它会被采用。
但是我可以告诉你为什么人们对函数式编程很兴奋:很多很多程序员都有一种"转换经验",他们发现使用函数式语言使他们的效率提高了两倍(或者可能是十倍),同时生成的代码更能适应变化,并且错误更少。这些人认为函数式编程是一种秘密武器;这种思维方式的一个很好的例子是保罗·格雷厄姆击败了平均水平。哦,他的申请呢?电子商务Web应用程序。
自2006年初以来,函数编程和并行性也引起了一些轰动。自从西蒙·佩顿·琼斯(SimonPeytonJones)这样的人至少从1984年开始就一直在担心并行性,直到函数语言解决了多核问题,我才屏息以待。但它确实解释了目前一些额外的嗡嗡声。
一般来说,美国大学在教授函数式编程方面做得不好。对介绍式编程使用方案的教学有很强的核心支持,Haskell也有一定的支持,但对函数式编程高级技术的教学却很少。我在哈佛大学教过这样一门课,今年春天在塔夫茨大学也会这样做。本杰明皮尔斯在宾夕法尼亚大学教过这样一门课程。我不知道保罗·哈达克是否在耶鲁做过什么。欧洲的大学正在做得更好;例如,在丹麦、荷兰、瑞典和英国的重要地方,功能规划被强调。我对澳大拉西亚正在发生的事情不太了解。
我没看到有人在这里提到大象,所以我想这取决于我:)
javascript是一种功能性语言。随着越来越多的人使用JS做更高级的事情,尤其是利用jquery、dojo和其他框架的更精细的点,Web开发人员的后门将引入FP。
与闭包结合使用,fp使JS代码非常轻,但仍然可读。
干杯,聚苯乙烯
Most applications are simple enough to be solved in normal OO ways
OO方式并不总是"正常"的,这个十年的标准是上个十年的边缘化概念。
函数式编程是数学。Lisp上的Paul Graham(Lisp的替代函数编程):
So the short explanation of why this
1950s language is not obsolete is that
it was not technology but math, and
math doesn’t get stale. The right
thing to compare Lisp to is not 1950s
hardware, but, say, the Quicksort
algorithm, which was discovered in
1960 and is still the fastest
general-purpose sort.
我敢打赌,当你使用时,你不知道你在进行函数式编程:
- Excel公式
- 石英作曲器
- JavaScript
- 徽标(海龟图案)
- 林克
- SQL
- underline.js(或lodash),D3
The average corporate programmer, e.g.
most of the people I work with, will
not understand it and most work
environments will not let you program
in it
不过,这只是时间问题。一般的公司程序员都会学习当前最重要的事情。15年前,他们不懂OOP。如果FP赶上了,你的"普通公司程序员"也会跟着来。
It's not really taught at universities
(or is it nowadays?)
变化很大。在我的大学,SML是第一个被介绍给语言学生的。我相信麻省理工学院将Lisp作为一门一年级课程来教授。当然,这两个例子可能不具有代表性,但我相信大多数大学至少提供了一些关于FP的可选课程,即使它们不把它作为课程的强制性部分。
Most applications are simple enough to
be solved in normal OO ways
但这并不是一个"足够简单"的问题。在FP中,解决方案是否更简单(或更可读、更健壮、更优雅、更具性能)?很多事情都是"简单到可以用Java解决",但是它仍然需要大量的代码。
无论如何,请记住,几十年来,支持外交政策的人一直声称这是下一件大事。也许他们是对的,但请记住,当他们5年、10年或15年前提出同样的要求时,他们不是这样的。
但是,有一件事对他们来说无疑是有利的,那就是最近,C已经向FP急剧转变,实际上它正在把一代程序员转变成FP程序员,而他们甚至没有注意到。这可能为外交政策的"革命"铺平道路。也许吧。;)
如果人看不到其他艺术的价值,他就无法理解他所选择的艺术的完美无缺。遵循规则只允许技术发展到某一点,然后学生和艺术家必须学习更多,并寻求更进一步。学习其他艺术和战略艺术是有意义的。
谁没有通过观察别人的活动了解更多关于自己的东西?学习剑,学习吉他。第一次学习商务。学习剑,会使你心胸狭窄,不允许你向外生长。
--宫本武藏,"五环书"
我认为大多数现实主义者并不认为函数式编程会流行(成为OO这样的主要范例)。毕竟,大多数业务问题都不是很好的数学问题,而是以各种方式移动和显示数据的繁琐规则,这意味着它不适合纯粹的函数式编程范式(monad的学习曲线远远超过oo)。
哦,函数式编程是让编程变得有趣的原因。它使你欣赏宇宙数学基础的简洁表达的内在的、永恒的美。人们说学习函数式编程会使你成为一个更好的程序员。这当然是非常主观的。我个人也不认为这是完全正确的。
它使你成为一个更好的众生。
函数语言的一个关键特征是第一类函数的概念。其思想是,可以将函数作为参数传递给其他函数,并将其作为值返回。
函数式编程涉及到编写不改变状态的代码。这样做的主要原因是,对函数的连续调用将产生相同的结果。您可以用任何支持一流函数的语言编写函数代码,但有些语言,如haskell,不允许您更改状态。事实上,你根本不应该产生任何副作用(比如打印文本),这听起来可能是完全无用的。
哈斯凯尔用了一种不同的方法来处理IO:Monads。这些对象包含要由解释器的顶级执行的所需IO操作。在任何其他级别上,它们只是系统中的对象。
函数式编程提供哪些优势?函数式编程允许用更少的潜在错误进行编码,因为每个组件都是完全隔离的。此外,使用递归和第一类函数可以简单地证明正确性,这通常反映了代码的结构。
我要指出的是,你所说的关于函数语言的每一件事,大多数人都是在20年前谈论面向对象的语言。当时,听到OO很常见:
1 2 3 | * The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it * It's not really taught at universities (or is it nowadays?) * Most applications are simple enough to be solved in normal IMPERATIVE ways |
变化必须来自某个地方。不管接受过早期技术培训的人是否认为不需要改变,一个有意义和重要的改变都会发生。你认为对OO的改变是好的吗,尽管当时所有人都反对它?
我一定很胖,但我还是不明白。有没有用功能性语言如f编写的小型应用程序的实际例子,在这里你可以查看源代码,并了解如何以及为什么使用这种方法比使用c_更好?
F可能会赶上,因为微软正在推动它。
赞成的意见:
- F将成为下一个版本的Visual Studio的一部分
- 微软现在正在建设一段时间的社区——福音传道者、书籍、与知名客户合作的顾问、微软会议上的重要曝光。
- F.Y.是第一类.NET语言,它是第一个具有巨大基础的函数式语言(不是我说Lisp,Haskell,Erlang,斯卡拉,OcAML没有很多库,它们不像.NET那样完整)。
- 强大的并行性支持
Contra:
- F很难开始,即使你擅长C和.NET-至少对我来说:(
- 很可能很难找到优秀的开发人员
所以,我给了50:50机会让F变得重要。其他的函数语言在不久的将来也不会实现。
我认为一个原因是,有些人认为一种语言是否被接受的最重要的部分是它有多好。不幸的是,事情很少这么简单。例如,我认为Python被接受的最大原因不是语言本身(尽管这很重要)。python之所以如此受欢迎,最大的原因是它巨大的标准库和更大的第三方库社区。
考虑到类似clojure或f_的语言是建立在JVM/CLR之上的,因此在这方面的规则可能是例外。结果,我没有答案。
在我看来,那些从没有学过口齿不清或计划作为本科生的人现在发现了它。正如在这个领域的很多事情一样,有一种倾向是炒作和创造高期望…
它会过去的。
函数式编程很棒。然而,它不会接管世界。C、C++、爪哇、C等将仍然存在。
我认为这将带来更多的跨语言能力——例如,用功能语言实现事物,然后用其他语言访问它们。
大多数应用程序都可以通过[在此处插入您最喜欢的语言、范例等]来解决。
尽管如此,不同的工具可以用来解决不同的问题。功能性只允许另一个高(更高?)级别抽象,允许在正确使用时更有效地完成工作。
当我读到《下一个主流编程语言:游戏开发者的视角》的时候,我的第一个想法是——我要学习哈斯克尔。
幻灯片演示文件
谷歌的HTML版本
它之所以流行是因为它是控制复杂性的最佳工具。见:-西蒙·佩顿·琼斯的109-116张幻灯片讲述了"哈斯克尔的味道"-Tim Sweeney的"下一个主流编程语言:游戏开发者的视角"
事情有一段时间一直在向功能方向发展。过去几年中,两个很酷的新孩子,Ruby和Python,都比之前更接近于功能语言——如此之多以至于一些Lisper已经开始支持其中的一个或另一个"足够接近"。
由于大规模并行的硬件对每个人都施加了进化的压力,功能语言处于应对变化的最佳位置,这并不像以前认为haskell或f将是下一件大事那样是一个飞跃。
您最近是否一直在关注编程语言的发展?所有主流编程语言的每一个新版本似乎都从函数式编程中借用了越来越多的特性。
闭包、匿名函数、将函数作为值传递和返回,这些都是以前只有Lisp和ML黑客知道的奇特特性。但渐渐地,c、delphi、python、perl、javascript增加了对闭包的支持。在没有闭包的情况下,不可能认真对待任何新出现的语言。
有几种语言,特别是python、c_和ruby,在本地支持列表理解和列表生成器。
ML在1973年首创了通用编程,但对泛型("参数多态性")的支持在过去5年左右才成为行业标准。如果我记得正确的话,FORTRAN支持2003的泛型,其次是Java 2004,C是2005,2008是Delphi。(我知道C++自1979以来就支持过模板,但是C++的STL的90%的讨论从"这里有魔鬼"开始。
是什么使这些特性对程序员有吸引力?这应该是显而易见的:它帮助程序员编写更短的代码。如果想要保持竞争力,将来的所有语言都将至少支持闭包。在这方面,函数式编程已经成为主流。
Most applications are simple enough to
be solved in normal OO ways
谁说不能对简单的事情使用函数式编程?并非每个功能程序都需要编译器、定理证明器或大规模并行电信交换机。除了我更复杂的项目外,我还经常使用f来编写一些临时的一次性脚本。
检查为什么函数编程很重要
因为FP在生产力、可靠性和可维护性方面有着显著的优势。许多核心可能是一个杀手级的应用程序,尽管有大量的遗留代码,但最终还是让大公司进行切换。此外,甚至像C这样的大型商业语言也因许多核心问题而呈现出独特的功能风格——副作用与并发性和并行性根本不匹配。
我不同意"普通"程序员不会理解它。他们会,就像他们最终理解OOP一样(如果不是更神秘的话,那就是神秘和怪异)。
此外,大多数大学确实教授FP,许多大学甚至把它作为第一门编程课程来教授。
我同意第一点,但时代变了。公司会做出回应,即使他们是后来的采纳者,如果他们看到有一个优势。生活充满活力。
上世纪90年代末,他们在斯坦福大学教授哈斯克尔(Haskell)和麻省理工学院(ML),我相信卡内基梅隆(Carnegie Mellon)、麻省理工学院(MIT)、斯坦福大学(Stanford)和其他一些好学校都在向学生们展示这门课程。
我同意大多数"在网络上公开关系数据库"的应用程序都将以这种方式持续很长时间。JavaEE、.NET、RoR和PHP已经为这个问题发展了一些很好的解决方案。
您遇到了一些重要的问题:它可能是通过其他方式无法轻松解决的问题,这将促进函数式编程。那会是什么?
大规模的多核硬件和云计算会推动它们发展吗?
我不知道它是否会流行,但根据我的调查,一种功能性语言几乎肯定值得学习,并且会使你成为一个更好的程序员。仅仅理解参考透明性就可以使许多设计决策变得如此简单——而且结果程序也更容易推理。基本上,如果遇到一个问题,那么它只会是单个函数输出的问题,而不是一个状态不一致的问题,这可能是由具有副作用的无感情语言中的数百个类/方法/函数中的任何一个造成的。
FP的无状态特性更自然地映射到Web的无状态特性,因此功能性语言更容易为更优雅、更安静的Web应用程序提供支持。与Java和.NET框架相比,这些框架需要像WestStand和会话密钥这样可怕丑陋的黑客来维护应用程序状态,并在一个基本上无状态的功能平台(比如Web)上维护有状态命令语言的(有时是相当漏的)抽象。
而且,应用程序的无状态性越强,就越容易进行并行处理。如果你的网站恰好变得流行起来,对网络来说非常重要。为一个站点添加更多的硬件以获得更好的性能并不总是那么简单。
讨论中遗漏的一点是,在当代的FP语言中可以找到最好的类型系统。此外,编译器可以自动推断所有(或至少大多数)类型。
有趣的是,在编写Java时,人们花费了一半的时间来编写类型名称,但是Java目前还不是类型安全的。虽然您可能永远不会在haskell程序中写入类型(编译器检查过的文档除外),但代码是100%类型安全的。
哇-这是一个有趣的讨论。我自己对此的看法:
fp使一些任务相对简单(与非fp语言相比)。没有一种FP语言已经开始接受FP的想法,所以我怀疑这种趋势将继续下去,我们将看到更多的合并,这将帮助人们更容易地实现向FP的飞跃。
我的观点是,现在微软已经把它推向了主流,它将会流行起来。对我来说,它之所以吸引人,是因为它能为我们做些什么,因为它是一个新的挑战,也是因为它对未来充满怨恨的工作机会。
一旦掌握了它,它将是另一个工具,进一步帮助我们提高程序员的工作效率。
一些想法:
- 自Lisp与Fortran之争以来,fp与命令式编程(OO、结构化等)之间的争论一直在激烈进行。我认为你提出了很好的问题,但要认识到这些问题并不是特别新的。
- FP的一部分是我们似乎认识到并发非常困难,而OO(例如Java)中的锁和其他机制只是一个解决方案。FP提供了一个令人耳目一新的改变,比如演员和无状态计算的能力。对于那些与OO搏斗的人来说,这片风景似乎非常吸引人。
- 是的,学校教FP。事实上,滑铁卢大学和其他一些大学提供了一年级课程的计划(此处参考)。
- 对于普通程序员来说,我确信在90年代早期,C++中给出了相同的参数。如果企业可以通过技术获得优势,你可以打赌人们将接受培训。
这并不是说这是一件确定的事情,也不是说在3-5年内不会有反冲(就像往常一样)。然而,FP的趋势是有价值的,值得关注。
除了其他答案外,用纯函数术语来表示解决方案还迫使人们更好地理解问题。相反,以功能性的方式思考会培养出更好的解决问题的能力。
*要么因为功能范式更好,要么因为它将提供一个额外的攻击角度。
我很难想象一种纯粹的功能性语言会成为今天的通用语言,这是我无法理解的原因(因为它们是火焰的饲料)。也就是说,无论语言如何(如果它允许的话),以功能性的方式编程都可以带来好处。对我来说,这是一种更容易测试代码的能力。我经常使用数据库…我倾向于:
这样做允许我为操作函数编写单元测试,而不需要创建模拟等。
我认为纯功能语言非常有趣…我只是觉得我们能从他们身上学到的东西对我很重要,而不是我们能用他们做什么。
实际上,我是在读过黑客和画家之后才开始学习Lisp的,我相信我会从Lisp中学到一些东西,这些东西能让我更好地了解我编程的其他东西。现在我不认为我会在我的日常生活中使用Lisp,仅仅是因为1995年有人创建了一个成为雅虎商店的网站。所以不管怎样,这是一个双赢(如果它抓住了我的机会,如果不是,我会赢,我会对如何编程和如何工作有更多的看法)
现在。。。关于另一个与此相关的问题,我认为32核进程明年到来时,编程会发生很大的变化吗?是的,我不知道它是否会是函数式编程,但是…我很肯定会有不同的东西!
It's not really taught at universities (or is it nowadays?)
我不知道现在的情况,但在90年代中期,我在CS课程中接受了米兰达和Lisp两门课程的学习。尽管从那以后没有使用纯功能语言,但它影响了我解决问题的方式。
Most applications are simple enough to be solved in normal OO ways
在90年代中期的CS课程中,OO(使用Eiffel教学)的教学与函数式编程相当。当时这两个国家都不是主流。OO现在可能是"正常"的,但从来没有这样过。
我有兴趣看看F是否是推动FP进入主流的东西。
- OOP被一般的公司程序员理解要花多长时间…?
- 1994年,我在乌得勒支大学(我想是)接受了函数式编程的教育,在过去的几年里,我只看到它开始在"现实世界"中流行起来。
- 没有所谓的"简单应用"。;-)
我认为,当我们开始在硬件中获得越来越多的核心时,软件的某些关键部分的(接近)无副作用编程是必不可少的。给函数编程多一点时间。而在当前和未来版本的C中的功能性喷洒将在准备这些公司程序员进行功能性编程时发挥很大作用,而他们甚至没有意识到这一点……
我认为,函数式编程语言成为"下一件大事"的最大理由是,将来多核处理器将成为标准。程序员必须利用这一点,而函数式编程为构建顶级并发软件提供了非常好的可能性。
P.S.我在波士顿大学上大学的时候(‘98-'02),我们花了一个学期的学习计划,这是Lisp的近亲。当我们刚开始学的时候,我想把头发扯下来。课程结束时,这是很自然的。
SlavaAkhmechet有一篇很棒的文章,叫做我们其他人的函数式编程(这篇文章让我进入了fp btw)。在FP带来的好处中,他非正统地强调了以下几点(我认为这有助于吸引软件工程师):
- 单元测试
- 调试
- 并发性
- 热代码部署
- 机器辅助校对和优化
然后继续讨论更传统讨论的fp的优点,如高阶函数、curring、lazy评估、优化、抽象控制结构(尽管不讨论monad)、无限数据结构、严格性、连续性、模式匹配、闭包等。
强烈推荐!
当然,FP是下一个最好的范例。现在哪种语言可能是下一步,这是困难的事情,但我相信可能是哈斯克尔,F,克洛尤,奥卡姆或尔朗。或者是具有更多fp构造和更好的并行性/性能支持的python,或者是具有parrot的perl 6,看起来非常有趣。
它已经在Hadoop中被map/reduce所吸引。
很多人都提到了功能语言。
但除了JavaScript之外,现在使用的一些最常用的函数语言。
在财务领域中使用Excel、SQL、XSLT、XQuery、J和K。
当然是二郎。
所以我想说,从这个列表中可以看出,功能编程技术每天都在主流中使用。
函数式编程很可能是工程师、科学家用来解决他们所面临问题的工具。它不会像早期的语言那样影响世界。然而,最难打败的产品是Excel,如果我是一名工程师,需要做计算,Excel就太棒了。
然而,F将成为另一个来源,并可能满足非计算机科学家的设计需求。让我们面对现实吧,计算机科学家在创造一种全新的做事方式方面做得很好。面向对象编程很棒。但有时你只需要一种方法来解一个方程,得到一个解,然后画出它的图形。就是这样。然后一种像f这样的语言来填充这个账单。或者你想建立一个有限状态机,F也可以是解决方案之一,但是C也可以是解决方案。
但当涉及到并行处理时,Excel会发光,并及时出现F。但以友好的方式,F=友好。
呃,很抱歉是个学究,但它已经流行起来了——我们称之为Excel。
http://research.microsoft.com/en-us/um/people/simonpj/papers/excel/
在计算机上运行的绝大多数程序都是用Excel或其众多流行的克隆版本之一编写的。
(有许多程序运行多次,用Excel编写的程序往往不属于这些程序——大多数Excel程序都有一个运行实例)
我认为你的问题的答案更多地在于"工作的正确工具"这句话,而不是最热门的东西。总是会有热门的新技术,而且总是会有人跳上它们。
函数语言已经存在一段时间了,现在它们正受到更多的关注。
微软在Visual Studio上推出了下一个版本。它是一种混合语言,如scala,与.NET框架的其余部分非常好地集成。我认为很多微软公司都会使用它来加速高度并行的数据处理应用程序和功能的开发。
我个人认为,对于分布式系统和多线程/并行编程功能编程,很快就会有突破。只要它通过编程库与现有的OOP范例集成。所以…在我看来,纯粹的功能性方法仍将是学术性的。
函数编程已经存在很长一段时间了,因为lisp是最早有编译器的语言之一,也因为mit的lisp机器。这不是一个新的范例(OO更新了很多),但是主要的软件平台往往是用易于翻译成汇编语言的语言编写的,而且它们的API非常喜欢命令式代码(Unix with C、Windows with C和Macintosh with Pascal和更高版本的C)。
我认为在过去几年中,新的创新是让各种各样的API流行起来,特别是对于那些与平台API无关的Web开发。由于您没有直接编码到win32 API或posix API,这就给了人们尝试函数语言的自由。
函数编程已经在imho上流行起来了,只是还不太明显。这种语言的强项是数学/阿尔戈里希姆语,这就是为什么光环人把它用于他们的真实事物的原因之一。
我不认为函数式语言能解决任何问题,而且这只是管理层试图推销的一种炒作,记住唯一的事实:
没有银弹。
其余的都是胡说八道,他们还说OO将解决我们的问题,Web服务将解决我们的问题,XML将解决我们的问题,但最终应用了上述事实,一切都失败了。还有,二十年后,谁说我们将使用二进制计算机呢?为什么不是定量计算机?没有人能预测未来,至少在这个星球上没有。(这是第二个事实)