我在这里看到了很多有关功能语言和内容的讨论。您为什么要使用一种“传统”语言?他们有什么优势?他们最糟糕的是什么?什么是理想的函数式编程应用程序?
我在这里看到了很多有关功能语言和内容的讨论。您为什么要使用一种“传统”语言?他们有什么优势?他们最糟糕的是什么?什么是理想的函数式编程应用程序?
Answers:
功能语言使用的语言范式不同于命令式和面向对象的语言。他们使用无副作用功能作为该语言的基本构建块。这使很多事情变得复杂,并使很多事情变得更加困难(或者在大多数情况下与人们习惯的事情有所不同)。
函数式编程的最大优点之一是,无副作用函数的执行顺序并不重要。例如,在Erlang中,它用于以非常透明的方式启用并发。而且由于函数语言中的函数的行为与数学函数非常相似,因此很容易将其转换为函数语言。在某些情况下,这可以使代码更具可读性。
传统上,函数式编程的主要缺点之一就是缺乏副作用。没有IO编写有用的软件非常困难,但是没有功能上的副作用很难实现IO。因此,大多数人从函数式编程中获得的不仅仅是从单个输入计算单个输出。在F#或Scala等现代混合范例语言中,这更容易。
许多现代语言都包含功能编程语言中的元素。C#3.0具有许多函数式编程功能,您也可以使用Python进行函数式编程。我认为函数式编程之所以流行,主要是因为两个原因:并发在普通编程中已成为一个真正的问题,因为我们越来越多地使用多处理器计算机。并且语言变得越来越容易访问。
我认为关于“捕捉”编程的功能方法没有任何问题,因为它已经被使用了40年(作为一种编程风格)。每当OO程序员编写支持不可变对象的简洁代码时,该代码就是借用了功能概念。
但是,如今,强制执行功能样式的语言越来越多地受到人们的追捧,这些语言在未来是否会占据主导地位是一个悬而未决的问题。我自己的怀疑是,诸如Scala或OCaml之类的混合,多范式语言 可能会以“纯粹”功能语言为主,就像纯OO语言(Smalltalk,Beta等)影响主流编程一样,但还没有结束成为使用最广泛的符号。
最后,我忍不住指出,您对FP的评论与几年前我从程序程序员那里听到的评论高度相似:
就像图形用户界面和“代码作为业务模型”是帮助OO得到更广泛认可的概念一样,我相信增加使用不变性和更简单(大规模)并行性将帮助更多的程序员看到功能方法所带来的好处。 。但是,尽管过去50多年左右我们所学到的知识构成了数字计算机编程的整个历史,但我认为我们仍有很多东西要学习。从现在开始的20年后,程序员会惊奇地回想到我们当前正在使用的工具的原始性质,包括现在流行的OO和FP语言。
对我来说,主要优点是其固有的并行性,尤其是当我们现在从更多的MHz转向越来越多的内核时。
我不认为它将成为下一个编程范式并完全替代OO类型的方法,但是我确实认为我们将需要用功能性语言编写一些代码,或者我们将使用通用语言来实现这一点。成长为包含更多功能结构。
我一直对下一件大事持怀疑态度。很多时候,“下一件大事”纯粹是历史的偶然,无论技术是否良好,都在正确的时间,正确的时间出现在正确的地方。示例:C ++,Tcl / Tk,Perl。所有有缺陷的技术都取得了巨大的成功,因为它们被认为可以解决当今的问题或与根深蒂固的标准几乎完全相同,或两者兼而有之。函数式编程确实确实很棒,但这并不意味着它将被采用。
但是我可以告诉你,为什么人们对函数式编程感到兴奋:许多程序员都有一种“转换经验”,他们发现使用函数式语言使他们在生产时的生产率提高两倍(或者可能是生产率的十倍)。具有更强的变更弹性和更少错误的代码。这些人认为函数式编程是秘密武器。保罗·格雷厄姆(Paul Graham)的《击败平均水平》(Beating the Averages)是一个很好的例子。哦,他的申请?电子商务Web应用程序。
自2006年初以来,关于函数式编程和并行性的话题也越来越多。自从至少从1984年以来,像Simon Peyton Jones这样的人就一直担心并行性,所以直到功能语言解决多核问题之前,我都不会屏息。但这确实解释了目前的一些其他嗡嗡声。
总体而言,美国大学在执行功能编程方面做得很差。对于使用Scheme进行入门编程的教学,有强大的支持核心,而Haskell也在那里获得了一些支持,但是对于函数式程序员而言,教授高级技术的方式很少。我曾在哈佛大学教授过这样的课程,今年春天将在塔夫茨大学再次授课。本杰明·皮尔斯(Benjamin Pierce)在宾夕法尼亚州(Penn)教授过这样的课程。我不知道保罗·哈达克(Paul Hudak)是否在耶鲁做过任何事情。欧洲的大学做得更好。例如,在丹麦,荷兰,瑞典和英国的重要地方都强调了函数式编程。我对大洋洲发生的事情不太了解。
我没有看到有人在这里的房间里提到大象,所以我认为这取决于我:)
JavaScript是一种功能语言。随着越来越多的人使用JS做更多高级的事情,尤其是利用jQuery,Dojo和其他框架的优点,FP将由Web开发人员的后门引入。
结合使用闭包,FP使JS代码非常轻便,但仍然可读。
干杯,PS
大多数应用程序都很简单,可以通过普通的OO方法解决
OO方法并非总是“正常”的。这十年的标准是过去十年的边缘化概念。
函数式编程是数学。Paul Graham谈Lisp(用Lisp替代功能编程):
因此,对于为什么这种1950年代的语言没有过时的简短解释是,它不是技术而是数学,并且数学不会过时。比较Lisp的正确方法不是1950年代的硬件,而是Quicksort算法,该算法于1960年发现,仍然是最快的通用排序算法。
我敢打赌,您在使用时不知道自己是函数式编程:
一般的公司程序员(例如,与我一起工作的大多数人)不会理解它,并且大多数工作环境都不允许您在其中编程
不过那只是时间问题。您的普通公司程序员会学到当前的大事。15年前,他们不了解OOP。 如果 FP赶上了潮流,那么您的“普通公司程序员”将紧随其后。
它不是在大学真正教授的(或者现在是吗?)
变化很大。在我的大学中,SML是向学生介绍的第一门语言。我相信麻省理工学院将LISP教授为一年级课程。当然,这两个示例可能并不具有代表性,但是我相信大多数大学至少都提供一些关于FP的可选课程,即使他们没有将FP设置为必修课程。
大多数应用程序都很简单,可以通过普通的OO方法解决
不过,这实际上不是“足够简单”的问题。FP中的解决方案会更简单(或更可读,更健壮,更优雅,更高效)吗?许多事情“足够简单,可以用Java解决”,但是仍然需要大量的代码。
无论如何,请记住,FP拥护者声称这是几十年来的下一件大事。也许他们是对的,但请记住,在5、10或15年前提出相同主张时,事实并非如此。
不过,绝对值得他们青睐的一件事是,最近C#向FP迈出了重大步伐,以至于它实际上使一代程序员变成了FP程序员,甚至没有引起他们的注意。这可能只是为FP“革命”铺平了道路。也许。;)
功能语言的一个主要功能是一流功能的概念。这个想法是,您可以将函数作为参数传递给其他函数,然后将它们作为值返回。
函数式编程涉及编写不会更改状态的代码。这样做的主要原因是,对函数的连续调用将产生相同的结果。您可以用任何支持一流功能的语言编写功能代码,但是有些语言(例如Haskell)不允许您更改状态。实际上,您根本不应该产生任何副作用(例如打印出文本)-听起来完全没有用。
Haskell相反地对IO采用了另一种方法:monads。这些对象包含要由解释器的顶层执行的所需IO操作。在任何其他级别上,它们只是系统中的对象。
函数式编程提供什么优势?由于每个组件都是完全隔离的,因此函数式编程可以减少潜在的错误编码。另外,使用递归和一流的功能还可以提供简单的正确性证明,这些证明通常反映了代码的结构。
我认为大多数现实主义者都不认为函数式编程会流行(成为像OO这样的主要范例)。毕竟,大多数业务问题不是数学问题,而是用于移动数据并以各种方式显示数据的命令式规则,这意味着它不太适合纯函数式编程范例(monad的学习曲线远远超过OO。)
OTOH,函数式编程使编程变得有趣。它使您欣赏宇宙基本数学的简洁表达所固有的永恒的美丽。人们说学习函数式编程将使您成为更好的程序员。这当然是高度主观的。我个人也不认为那是完全正确的。
它使你变得更好。
我一定很稠密,但我还是不明白。是否有用F#这样的功能语言编写的小型应用程序的实际示例,您可以在其中查看源代码,并了解使用这种方法比使用C#更好和如何的原因。
我要指出的是,您所说的有关函数式语言的一切,大多数人都是在大约20年前谈论过面向对象的语言。那时,听说OO非常普遍:
* 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#可能会流行,因为微软正在推动它。
优点:
相反:
因此,我给F#50:50的机会,使其变得很重要。其他功能语言不会在不久的将来实现。
您最近是否一直在关注编程语言的发展?所有主流编程语言的每个新发行版似乎都从函数式编程中借用了越来越多的功能。
闭包,匿名函数,传递和返回函数作为值,这些值曾经是只有Lisp和ML黑客才知道的奇特功能。但是逐渐地,C#,Delphi,Python,Perl,Javascript添加了对闭包的支持。没有封闭就不可能认真对待任何新兴语言。
几种语言(尤其是Python,C#和Ruby)对列表推导和列表生成器具有本机支持。
ML于1973年开创了泛型编程的先河,但是对泛型(“参数多态性”)的支持仅在最近5年左右才成为行业标准。如果我没记错的话,Fortran在2003年支持泛型,其次是Java 2004,C#在2005年,Delphi在2008年。(我知道C ++自1979年以来就支持模板,但是90%的C ++ STL讨论都始于“这里有妖魔”。 )
是什么使这些功能吸引程序员?它应该显而易见:它可以帮助程序员编写较短的代码。如果将来所有语言都想保持竞争力,它们将至少支持关闭。在这方面,函数式编程已经成为主流。
大多数应用程序都很简单,可以通过普通的OO方法解决
谁说过不能将函数式编程用于简单的事情?并非每个功能程序都需要成为编译器,定理证明者或大规模并行电信交换机。除了更复杂的项目之外,我还经常将F#用于临时的临时脚本。
它之所以流行是因为它是控制复杂性的最佳工具。请参阅:
-Simon Peyton-Jones的幻灯片109-116讲“ Haskell的味道
”-Tim Sweeney撰写的“下一代主流编程语言:游戏开发者的观点”
因为FP在生产率,可靠性和可维护性方面具有显着优势。多核可能是一个杀手级应用,尽管有大量的遗留代码,但最终还是让大公司进行了转换。此外,由于许多核的关注,甚至C#之类的大型商业语言也呈现出独特的功能风格-副作用很简单与并发和并行性不太匹配。
我不同意“普通”程序员不会理解它。就像他们最终了解OOP一样,他们将(对于OOP来说同样神秘又奇怪)。
此外,大多数大学都教授FP,许多甚至将其作为第一门编程课程。
我不知道它是否会流行,但是从我的调查来看,功能语言几乎肯定值得学习,它将使您成为更好的程序员。仅仅了解参照透明性,就可以使许多设计决策变得容易得多,并且由此产生的程序也更容易推论。基本上,如果遇到问题,那么它往往仅是单个函数的输出问题,而不是状态不一致的问题,这可能是由数百个类/方法/函数中的任何一个引起的以含蓄的语言出现副作用。
FP的无状态性质更自然地映射到Web的无状态性质,因此功能性语言更容易将其自身应用到更优雅的RESTFUL Web应用程序中。与JAVA和.NET框架形成对比,后者需要借助诸如VIEWSTATE和SESSION密钥之类的丑陋的HACK来维护应用程序状态,并在基本无状态的功能平台(如Web)上维护有状态命令性语言的(有时是非常泄漏的)抽象。
而且,您的应用程序越无状态,它越容易进行并行处理。如果您的网站正变得流行,那么这对网络来说非常重要。仅向站点添加更多硬件以获得更好的性能并不总是那么容易。