选择功能性编程语言


48

最近,我读了很多有关函数式编程语言的主题(实际上,几乎是去年)。我真的很想选一个并彻底学习它。

上学期,我被介绍给Scheme。我爱它。喜欢语法的极端简单性,同调性原则,宏(卫生和非卫生),过程的n个类等。

Scheme的问题在于它是一种学术语言。我认为它不是真正在生产环境中使用的。我也不认为拥有我们的简历特别好。因此,我一直在寻找替代方案。它们很多,而且它们的流行程度似乎都差不多。

我还考虑过一些其他功能语言的想法:

  • Clojure:这听起来很不错,因为它可以访问Java世界,面向可伸缩性和并发性,但是Java世界现在不处于边缘吗?我已经非常了解Java,但是根据JVM添加更多能量是否明智?
  • Haskell:看起来像是一种很受赞赏的语言,但是根据我的阅读,它也更多是一种学术语言。
  • Lisp:一直存在至今。它似乎具有Scheme所提供的大部分功能。它有一个很大的社区。据我所知,它可能是业界使用最广泛的函数式编程语言。
  • F#:不是真的考虑过。我不是MS资料的忠实拥护者。我没有钱购买他们的软件(我可以让他们摆脱大学联盟的束缚,但我更倾向于使用社区驱动的解决方案)。虽然...我想这将是最佳的职业导向选择。

今晚,我倾向于Lisp。一周前是Haskell。在此之前是Clojure。在过去的一年中,我在做一些Scheme是为了娱乐,而不是因为您知道的原因而推动它。现在,我想变得认真起来(关于学习一个,关于使用它进行实际的项目,关于也许最终与其进行专业合作)。我的问题是,我需要先深入学习它们,然后才能选择其中的一个。


5
无论您选择什么,都要编写大量用于其中的代码。

8
没想到Scala吗?
ykombinator 2010年

@ykombinator:我听说过,但是没有进一步搜索。我不知道它是否可以提供比我列出的选项更多的东西,或者它可能会带来每个选项中有趣的选项的组合...不知道。在我看来,它听起来像是一种低调的语言,尽管它似乎越来越流行。
Joanis 2010年

1
我不知道您在哪里听说Java世界处于“边缘”状态-它正在经历一个巨大的复兴,这主要归功于a)OpenJDK成为标准实现b)新的JVM语言(如Scala和Clojure)以及c)选择JVM作为目标平台和d)Android,大数据/云项目正在增加。截至2012年初,它可能是唯一一个最令人兴奋的平台了……
mikera 2012年

1
@mikera:同意。这已经有一年多的历史了,就在Oracle收购Sun Microsystems之后,所有令人担忧和猜测的Java的未来都会受到更多控制公司的控制而受到损害...幸运的是,目前JVM看起来非常安全!
约阿尼斯(Joanis)2012年

Answers:


35

由于您需要实用的  语言:

替代文字

注意,尽管最近对Clojure和F#产生了一些兴趣,但Haskell和Lisp在行业中的使用率却比其他公司高。

但是看看当我们将Scheme添加到组合中时会发生什么:

替代文字

嗯,现在看起来不像是学术语言,不是吗?

实际上,以上图表可能是一个谎言;除编程语言外,“方案”一词还可以在其他需要帮助的广告中显示。:)

因此,这是另一个可能更具代表性的图表:

替代文字

如果您想探索Scheme的真正方言,请看一下Racket。


哇,好帖子。球拍正是我正在使用的... PLT-Scheme是我开始学习时的名字。最后一个图形中的红线使我感到困扰。没想到Scheme可以使用那么多。Clojure肯定正在起飞。嗯...
Joanis 2010年

@M。乔妮丝(Joanis):在最后两张图上撒一粒盐;楼梯外观和最后一张图表的波动性表明图中没有很多数据点,尽管它确实表明有人认为这些语言值得付费。
罗伯特·哈维

@Robert Harvey,第二张图到第三张图有什么变化?
systemovich 2010年

@Geoffrey:看字幕;我在搜索词中添加了“开发人员”一词。
罗伯特·哈维

请注意,Haskell和Lisp也是同音异义词,Indeed的数据并未推广到世界其他地区。ITJobsWatch列出了79个Scala职位,55 F#,47 Haskell,30 Lisp和7 Clojure职位。
乔恩·哈罗普

17

如果您想学习函数式编程,最好先学习Haskell,然后再使用所需的任何语言。您可以使用其他语言学习函数式编程,但是它们仍然允许命令式和面向对象的代码。如果您使用Haskell编写真实的程序,则可以更快地学习函数式编程,因为其他范例无法使用。

编写完Haskell程序后,您将拥有诸如monads之类的工具以及诸如无点编码之类的技术,可以将您选择的语言带入其中。这些概念似乎特别适合Scheme。


我认为您首先选择一种纯函数式语言是正确的。我希望看到纯净的功能语言排序。
Joanis 2010年

@M。Joanis:在您提出的问题中,我想说Haskell是最纯正的语言,其次是Clojure,F#和Lisp。
拉里·科尔曼

15

实际上,如果您能够在Scheme中实施一个相当复杂的系统,那么您可能希望在其中工作的公司中就相当可取了。在我职业生涯的早期,我遇到了一些在Scheme中做过很多工作的学生,唯一不利的情况是他们无法解释自己的工作或对实施基础数据的理解不够充分在合理的时间内构建结构和算法。我总是让求职者以他们喜欢的语言回答这些问题。我确实遇到了一些认为自己最擅长Scheme的人,他们设法在一些容易的事情上作了很多努力,例如在链接列表中添加元素,这使我感到困惑。

但是,如果您能够“完善”“方案”以编写甚至是普通的Web应用程序,那么对于大多数严肃的软件公司来说,这将是一个不错的卖点。

如果您在“ blub”商店进行面试,而开发人员只是因为您精通Scheme或Haskell或F#而认为您很奇怪,那么您可能不想在那儿工作。在大多数情况下,有能力的开发人员可以选择演出,因此,除非您能想到的唯一选择是公司,否则请不要冒“实用性”。努力胜任,灵活和解决问题。

大学与实用性无关。这是关于创建一个安全的环境来探索和学习的。实际上,这是有用的,即使您最终在余下的职业中编写普通软件也是如此。

话虽这么说,但我不明白为什么您会这么快就只限于这些选择之一。您可以在大约4周内轻松了解所有四种语言,然后选择其中一种来专注于与您当前的心血来潮最接近的网格。然后回到您的另一个选项,并尝试实现类似的功能。转到更复杂的内容,然后再次考虑您的选择。实验很好。除非您下个月要谋生,否则您无需成为专家。

我已经用Scheme,F#,Emacs Lisp和Common Lisp编写了一些文章,并且至少在过去的几年中偶尔阅读了Haskell的一些文章。我不能说我是其中任何一个的专家,但是对这些语言的每次游览都使我在我专业工作的所有其他语言(C#,Java,Ruby和Boo,Perl和Python)中受益。好奇心会为您建立更持久,更充实的职业。


2
“好奇心将为您建立更持久,更充实的职业。” 这句话非常鼓舞人心。你是对的。我太着急了。我总是觉得这将花费太多时间来学习...如果我可以回溯12年的话,那我就不会浪费所有的时间在VB和C ++上。我觉得这些年非常浪费。我还不够好奇。我想编写东西。使用我所知道的语言就足够了。当时我以为我知道很多,但事实并非如此可怕。
Joanis 2010年

10

我参加了Haskell了一段时间,但得出的结论是它有点过于学术化。做任何实际的事情都很难。在纯函数式语言中,像IO之类的东西就不太适合模型,因此您必须处理monad。我确定我必须花大量时间才能勉强胜任,所以我继续前进。

我在大学里做过Scheme。听起来可能微不足道,但是所有的父母确实都在分散注意力/烦人。在使用Python之类的语言后,很难再回到这一点。

最近,我一直在探索F#。它是功能性的,但在需要时也可以是命令式的和面向对象的。这样,再加上可以使用任何.NET库,就可以轻松地将纯功能部分与更加实用的内容(例如GUI,IO和网络)混合在一起。您可以获得F#的独立版本。

http://www.microsoft.com/downloads/zh-CN/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en


F#和Clojure并非纯粹是功能性的事实对它们的支持起着重要作用。也许有一天F#可能是我进入.Net家族的切入点……
Joanis 2010年

1
@MJoanis,您说的是针对F#的费用,但正如Erik指出的那样,您可以完全免费。
Benjol 2010年

如果我没看错条款,那么您基本上可以在不使用它(或购买许可证)的情况下免费获得它。但是我知道,如果我最终进入使用Visual Studio的公司,那仍然是一件非常好的事情。一旦我使用更自由的函数式编程语言开始工作,我可能会尝试一下。
乔尼斯(Joanis)2010年

1
@M。Joanis:不,F#甚至是开源的,您可以尝试在其他平台的Mono上运行。
乔恩·哈罗普

自2010年以来,时代可能已经改变,但是作为最近几个月开始学习haskell的人,我认为在haskell中进行IO一点都不困难。对于基本知识,您只需要学习一些新的do语法即可。获得真正的基本理解需要花上几个星期的时间,但我真的不明白单子的模糊性。我认为他们比OOP中的类,实例,静态成员和所有其他与状态相关的爵士乐更难学习。
2016年

9

从希望使用一种实用的通用功能编程语言的角度来看,我在一两年前评估了所有主要的功能语言。

我最终选择了Clojure,后来证明这是一个不错的选择。

广义地说,主要原因是:

  • 图书馆生态系统 -要使一种语言有用,您需要访问优质的图书馆。使用JVM意味着您可以轻松访问最大的开源库和工具生态系统,因此从实用的角度出发,选择JVM语言是不费吹灰之力的。Scala在这里也得分很高。

  • 宏元编程 -Lisp的这一方面一直吸引着我,特别是因为我预计会进行大量的代码生成。我非常赞赏保罗·格雷厄姆(Paul Graham)的短文“ 击败平均水平 ”中的论点。各种Lips在这里都得分很高。

  • 性能 “足够好”-Clojure总是经过编译,并获得了JVM JIT优化器和出色的GC的好处。与往常一样,使用功能语言会带来一些开销,但是使用Clojure显然可以轻松地达到Java速度(​​Clojure在需要的情况下支持Java原语和可选的静态类型)。我的估计是,Clojure的速度比优化Java或C ++代码所能达到的速度慢2-5倍,这与您在有缺陷的基准测试中看到的一致,并且随着时间的流逝,我希望两者之间的差距会进一步缩小。而且,仅用纯Java编写对性能敏感的代码并从Clojure调用它就很容易。

  • 并发 -Clojure具有相当独特且强大的并发方法,尤其是对于高度多核并发而言。有点难以解释,但是这段视频非常适合介绍原理。我认为Clojure当前对于棘手的问题“如何使用功能性编程语言管理共享,并发和可变状态?”具有最佳答案。

  • 语言设计 -Clojure是IMO一项经过深思熟虑的语言设计。示例包括除常规Lisp括号外的vector []和map {}文字,使用不变的持久数据结构,通过序列抽象支持整个语言的惰性以及为程序员提供各种正交功能以解决不同的问题。看到抽象简单的艺术

  • 社区 -始终是主观的,但我喜欢我在Clojure社区中看到的内容。态度非常有益,建设性和务实。强烈强调“完成任务”,这可能反映出许多Clojure人(包括Rich Hickey本人)来自构建复杂企业系统的背景。Clojure社区与Java社区之间也有很强的联系,这一事实对于说服我Clojure不会陷入“小众市场”的风险非常重要。

如果我不得不列举Clojure的一些小缺点,这些将是:

  • 动态类型 -通常这在生产率方面是一个优势,但平均而言,我认为我会以此为代价进行更强大的类型检查和推断。通常,通过使用良好的自动化测试套件可以缓解这种情况,但是如果您喜欢通过编译器静态验证的类型,那么Haskell或Scala可能更适合您。

  • 尖端 -Clojure的发展非常迅速,并且正在进行很多创新-缺点是有大量的实验,某些库和工具仍不成熟,并且您之间在Clojure主要版本之间偶尔会有突破性的更改需要注意。

总的来说,如果您想使用出色而实用的现代功能语言,我认为Clojure不会出错!


1
谢谢!很棒的帖子!这些天,我只是考虑将其用于公司内部项目,该项目将主要基于树和递归性。另外,我们这里有很多Java代码,可以与Clojure一起重用。
乔尼斯(Joanis)2012年

6

看来您已经完成家庭作业,因此您可能已经知道这一点,但是Scheme是Lisp的方言,就像Common Lisp一样。如果您喜欢Scheme的很多事情,但不喜欢它的学术性质,请尝试Common Lisp。根据TIOBE指数,它是排名26的第13种最受欢迎​​的语言-Scheme

您提到的语言很少出现在我最近见过的工作描述中,尽管那可能只是我的小样本集。我个人将学习Haskell,即使我不希望在工作中直接使用该语言。对于我将来的程序设计而言,功能编程的概念比该语言本身的直接销售能力更有价值。


感谢TIOBE链接,这是一个有趣的参考。我猜您选择Haskell是因为其在函数式编程方面的纯正性?
乔尼斯(Joanis)2010年

1
@ M.Joanis:差不多,尽管我也想稍后再使用Lisp。见programmers.stackexchange.com/questions/18838/...
齐克

选择的答案很有意义。在我真正掌握了整个功能范例之前,纯净似乎是必经之路。
Joanis 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.