当前位置:  开发笔记 > 编程语言 > 正文

为何选择功能语言

如何解决《为何选择功能语言》经验,为你挑选了16个好方法。

我在这里看到很多关于函数式语言和东西的讨论.你为什么要使用"传统"语言?他们做得更好?他们更糟糕的是什么?什么是理想的函数式编程应用程序?



1> Mendelt..:

功能语言使用与命令式和面向对象语言不同的范例.他们使用无副作用的函数作为语言的基本构建块.这使得许多事情变得更加困难(或者在大多数情况下与人们习惯的不同).

函数式编程的最大优点之一是无副作用函数的执行顺序并不重要.例如,在Erlang中,这用于以非常透明的方式启用并发.因为函数式语言中的函数与数学函数非常相似,所以很容易将它们转换为函数式语言.在某些情况下,这可以使代码更具可读性.

传统上,函数式编程的一大缺点也是缺乏副作用.在没有IO的情况下编写有用的软件非常困难,但IO很难在没有功能副作用的情况下实现.所以大多数人从来没有比从单个输入计算单个输出更多的功能编程.在像F#或Scala这样的现代混合范式语言中,这更容易.

许多现代语言都有来自函数式编程语言的元素.C#3.0有很多函数式编程功能,你也可以在Python中进行函数式编程.我认为函数式编程普及的原因主要是由于两个原因:并发性在普通编程中成为一个真正的问题,因为我们正在使用越来越多的多处理器计算机; 并且语言越来越容易获得.


用纯函数式语言编写IO代码并不困难.它们都提供了一种编写IO代码的简单机制,就像在命令式语言中一样.他们所做的就是*强制执行*,你不能在其接口被声明为不执行IO的其他代码中调用IO代码.一个类比将是一个动态语言程序员抱怨像Java这样的静态类型语言使得很难从方法中返回她想要的任何类型,因为她必须返回类型声明所说的它将返回的任何内容.
你可以在python中进行函数式编程,但它真的很糟糕.http://stackoverflow.com/questions/1017621/functional-programming-in-python
Haskell是纯函数式语言的一个例子,它没有你说的缺点.它实际上使得处理副作用变得更加容易,因为副作用被封装,并且使程序员能够实现比命令式语言更强大的抽象级别......真的,每个人都应该尝试Haskell,真正掌握它,并实现为什么它如此强大.

2> joel.neely..:

我不认为编程"追赶"的功能方法有任何疑问,因为它已经使用了(作为一种编程风格)大约40年.每当OO程序员编写有利于不可变对象的干净代码时,该代码就是借用功能概念.

然而,强制执行功能风格的语言现在正在获得大量虚拟墨迹,以及这些语言将来是否会占据主导地位是一个悬而未决的问题.我自己怀疑Scala或OCaml等混合,多范式语言 可能会主导"纯粹"功能语言,就像纯OO语言(Smalltalk,Beta等)影响主流编程但尚未结束作为最广泛使用的符号.

最后,我无法抗拒地指出你的评论是FP与我多年前从程序程序员那里听到的评论高度平行:

(神话般的,恕我直言)"普通"程序员不理解它.

它没有被广泛传授.

您可以用它编写的任何程序都可以使用当前技术以另一种方式编写.

正如图形用户界面和"代码作为业务模型"是帮助OO得到更广泛认可的概念一样,我相信增加使用不变性和更简单(大规模)并行性将有助于更多程序员看到功能方法提供的好处.但是,尽管我们在过去50多年中已经了解了数字计算机编程的整个历史,但我认为我们还有很多需要学习的东西.二十年后,程序员将惊讶于我们目前使用的工具的原始性质,包括现在流行的OO和FP语言.


@bibac:20年前我们编写C代码,并讨论了Clipper或Turbo Pascal的优点.面向对象是学术界的专属领域.提出一点点变化是彻头彻尾的荒谬.
看看20年前.编程方面的进展并不多.好吧有更好的工具,也许是一种新语言或2,但从根本上来说并没有太大的改变.这将需要20多年.我们曾经以为我们会在2000年看到飞行汽车.:)
O'Caml虽然是爱尔兰人.
@Daniel:请提供一些人,他们主张Clipper的"优点".他们需要被追捕并被绳之以法.
@alex奇怪:"支持不变性"和"避免副作用"在面向对象和命令式编程学校中已经有很长一段时间了.(那有什么不喜欢的?;-)
我不喜欢"清洁代码"是一个功能概念的含义.
"从现在起二十年......"难道不是它总是如何运作?现在是活着的好时机,几乎每个领域都有如此迅速的进步.

3> Steven Robbi..:

对我来说,主要的优点是它固有的并行性,特别是当我们正在从更多的MHz转向越来越多的内核时.

我认为它不会成为下一个编程范式并完全取代OO类型的方法,但我认为我们会发现我们需要用函数式语言编写一些代码,或者我们的通用语言将会成长为包含更多功能性结构.


由于没有共享数据,因此功能没有副作用.您关心的只是返回值.(对于OO /程序程序员来说,这是一个非常难以理解的问题.)因此可以立即调用许多函数,只要一个函数的输出不用作另一个函数的输入.
我们已经看到了这种情况.它将来会发生更多.所以我同意这一点100%.
我发现这个答案很有趣,我不知道任何函数式语言,为什么它们被认为更适合并行性?

4> user21714..:

即使您从未专业地使用函数式语言,理解函数式编程也会使您成为更好的开发人员.它将为您提供有关代码和编程的新视角.

我说没有理由不学习它.

我认为能够很好地融合功能和命令式风格的语言是最有趣的,并且最有可能成功.


不同的编程范式从不同的角度处理问题,并且通常需要"不同的思维方式"或思维方式.并以多种不同的思维方式训练自己(暗示学习在哪种情况下使用哪一种......)从来都不是坏事.

5> Norman Ramse..:

我总是对下一件大事持怀疑态度.很多时候,下一件大事是纯粹的历史事故,无论技术是否好,都能在合适的时间出现在正确的地方.示例:C++,Tcl/Tk,Perl.所有有缺陷的技术都非常成功,因为它们被认为可以解决当时的问题,或者与根深蒂固的标准几乎相同,或两者兼而有之.功能编程可能确实很好,但这并不意味着它将被采用.

但我可以告诉你为什么人们对函数式编程感到兴奋:很多很多程序员都有过一种"转换体验",他们发现使用函数式语言可以使他们在生成时生成效率提高两倍(或者生产率提高十倍)代码更易于修改并且错误更少.这些人认为函数式编程是一种秘密武器; 这种心态的一个很好的例子是保罗格雷厄姆的击败平均数.哦,还有他的申请?电子商务网络应用程序.

自2006年初以来,关于函数式编程和并行性的讨论也很多.自从至少1984年以来,像Simon Peyton Jones这样的人一直在担心并行性问题,我不会屏住呼吸,直到函数式语言解决多核问题.但它确实解释了一些关于现在的额外嗡嗡声.

总的来说,美国大学在教授函数式编程方面做得很差.使用Scheme教授介绍编程有很强的核心支持,而Haskell也有一些支持,但是对功能程序员教授高级技术的方式却很少.我在哈佛大学教过这样一门课程,今年春天将在塔夫茨大学再次这样做.本杰明皮尔斯在宾夕法尼亚大学教过这样的课程.我不知道Paul Hudak在耶鲁大学做过什么.欧洲的大学做得更好; 例如,在丹麦,荷兰,瑞典和英国的重要地方强调功能性节目.我对澳大拉西亚的情况了解不多.


我在uni(在澳大利亚)教过Java/C++,但我的一些同事去了不同的大学,他们在Haskell做了几个单位.它既用于编程的介绍,也用于他们的最后一年单元之一.我听到他的同事在第一次介绍他之后对一位Java讲师说了什么(当时他只知道Haskell)时,我笑了起来 - "什么?!你的意思是你有东西而且你不喜欢" t _KNOW_它是什么类型的?!"

6> 小智..:

我没有看到有人在这里提到大象,所以我认为这取决于我:)

JavaScript是一种功能语言.随着越来越多的人用JS做更高级的事情,特别是利用jQuery,Dojo和其他框架的更精细点,FP将由Web开发人员的后门引入.

结合闭包,FP使JS代码非常轻巧,但仍然可读.

干杯,PS


Javascript允许一个以功能方式编程.然而,它是一种交叉范式语言,允许人们以各种不同的方式编程(我更喜欢,但这不相关)... OO,功能,程序等.
这就是我真正开始挖掘函数式编程的方法.没有比Prototype.js的list.Each(function(item){})或jQuery的整个操作方法更好的了.

7> Michael Paul..:

大多数应用程序都很简单,可以通过正常的OO方式解决

    OO方式并非总是"正常".这个十年的标准是过去十年的边缘化概念.

    函数式编程是数学.关于Lisp的Paul Graham(Lisp的替代函数式编程):

因此,对于20世纪50年代语言为何没有过时的简短解释是,它不是技术而是数学,而数学并不是陈旧的.比较Lisp的正确之处不是20世纪50年代的硬件,而是Quicksort算法,它在1960年被发现并且仍然是最快的通用类型.



8> Breton..:

我敢打赌,当你使用时,你不知道你是函数式编程:

Excel公式

Quartz Composer

使用Javascript

徽标(龟图形)

LINQ

SQL

Underscore.js(或Lodash),D3


如何将Javascript视为函数式编程?
它具有一流的功能,高阶函数,闭包,匿名函数,部分应用,currying和组合.
请将C添加到该列表中
哈哈.一旦写了一个负载还款Excel公式,它比具有嵌套函数的屏幕宽.我有点知道那时我是功能编程,但还不知道这个术语.
@MandeepJanjua:嗯?怎么会?或者为什么不用任何语言呢?

9> jalf..:

一般的企业程序员,例如我与之合作的大多数人,都不会理解它,大多数工作环境都不允许你在其中编程

那个只是时间问题.您的普通企业程序员可以学习当前的大事.15年前,他们不了解OOP. IF FP迎来了,您的"普通企业程序员"将会跟进.

它不是真的在大学教过(或者现在是不是?)

变化很大.在我的大学,SML是学生介绍的第一语言.我相信麻省理工学院教授LISP作为第一年的课程.当然,这两个例子可能不具有代表性,但我相信大多数大学至少提供一些关于FP的可选课程,即使它们没有成为课程的强制性部分.

大多数应用程序都很简单,可以通过正常的OO方式解决

然而,这并不是一个"足够简单"的问题.FP中的解决方案是否更简单(或更可读,更健壮,更优雅,更高效)?很多东西"很简单,可以在Java中解决",但它仍然需要一些神奇的代码.

在任何情况下,请记住,FP支持者声称它已成为几十年来的下一件大事.也许他们是对的,但请记住,他们在5年,10年或15年前做出同样的主张时并非如此.

然而,对他们有利的一件事是,最近,C#已经向FP急剧转向,实际上它将一代程序员转变为FP程序员,而他们甚至没有注意到.这可能只是为FP"革命"铺平了道路.也许.;)



10> shawndumas..:

如果他不能看到其他艺术的价值,他就无法理解他所选艺术的完美和不完美.遵循规则只允许在技术上达到一定程度,然后学生和艺术家必须学习更多并进一步寻求.研究其他艺术以及策略是有意义的.

通过观察他人的活动,谁还没有学到更多关于自己的东西?学习剑学习吉他.学习拳头学习商业.只是研究剑将使你心胸狭窄,不允许你向外生长.

- 宫本武藏,"五环之书"



11> obecalp..:

我不认为大多数现实的人认为函数式编程会流行(成为像OO这样的主要范例).毕竟,大多数业务问题都不是很好的数学问题,而是毛茸茸的命令规则来移动数据并以各种方式显示它们,这意味着它不适合纯函数式编程范例(monad的学习曲线远远超过OO.)

OTOH,函数式编程使编程变得有趣.它让你欣赏宇宙底层数学的简洁表达所固有的,永恒的美.人们说学习函数式编程会让你成为更好的程序员.这当然是非常主观的.我个人认为这也不完全正确.

它会让你变得更有感染力.


Monads不难理解.不要买那个公牛.
我认为OO本质上不比FP容易.这真的取决于你的背景(我是一个数学家,猜猜我觉得更容易吗?)该死的你和你的疯狂规则.

12> Kyle Cronin..:

功能语言的一个关键特性是一流功能的概念.这个想法是你可以将函数作为参数传递给其他函数并将它们作为值返回.

函数式编程涉及编写不改变状态的代码.这样做的主要原因是对函数的连续调用将产生相同的结果.您可以使用支持第一类函数的任何语言编写功能代码,但有些语言(如Haskell)不允许您更改状态.事实上,你根本不应该产生任何副作用(比如打印文本) - 听起来它可能完全没用.

相反,Haskell采用了不同的IO方法:monads.这些对象包含由解释器顶层执行的所需IO操作.在任何其他级别,它们只是系统中的对象.

函数式编程有哪些优点?功能编程允许编码具有较少的错误潜力,因为每个组件都是完全隔离的.此外,使用递归和第一类函数可以简单地证明正确性,这通常反映了代码的结构.



13> Mike K..:

我必须密集,但我仍然没有得到它.有没有用F#这样的函数式语言编写的小应用程序的实际示例,您可以查看源代码,看看如何以及为什么使用这种方法比使用C#更好?


请参阅此F#库:http://www.quanttec.com/fparsec/tutorial.html.我希望在C#中看到示例代码,其解析器看起来像F#代码一样优雅和可读,即使它们被编译为相同的指令.并尝试将FP#从F#移植到C#,看看代码是如何膨胀的.

14> RD1..:

我想指出的是,一切你曾经说过关于函数式编程语言,大多数人都在大约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的改变是好的?


*普通的公司程序员,例如我与之合作的大多数人,都不会理解它,而且大多数工作环境都不允许你编程 - 在我工作过的许多地方,这仍然是OOP的真实情况:)(当然他们_say_他们正在做OOP,但他们不是

15> zendar..:

F#可能会流行,因为微软正在推动它.

优点:

F#将成为下一版Visual Studio的一部分

微软正在建立一段时间的社区 - 传播者,书籍,与知名客户合作的顾问,以及在MS会议上的重要曝光.

F#是一流的.Net语言,它是第一个带有非常大的基础的函数式语言(不是说我说Lisp,Haskell,Erlang,Scala,OCaml没有很多库,它们不像.Net那么完整是)

对并行性的强烈支持

魂斗罗:

即使你对C#和.Net很好,F#也很难开始 - 至少对我而言:(

可能很难找到优秀的F#开发人员

所以,我给F#50:50的机会变得重要.其他功能语言不会在不久的将来成功.


我认为Scala是JRE的一个非常深厚的基础.
关于图书馆,这取决于你在做什么.F#针对的是金融行业,也适用于科学计算,但OCaml实际上拥有比.NET更好的应用程序库.例如,当我从OCaml来到F#时,我找不到合适的FFT,最终在C#中编写(并销售)我自己的F#,然后是F#.

16> Jason Baker..:

我认为一个原因是有些人认为语言是否被接受最重要的部分是语言有多好.不幸的是,事情很少这么简单.例如,我认为背后Python的接受的最大因素不是语言本身(尽管这非常重要的).Python如此受欢迎的最大原因是它庞大的标准库以及更大的第三方库社区.

考虑到它们是基于JVM/CLR构建的,Clojure或F#等语言可能是规则的例外.结果,我没有他们的答案.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有