it-swarm.cn

选择功能性编程语言

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

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

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

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

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

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

49
Joanis

由于您想要一种实用语言:

alt text

请注意,尽管最近对Clojure和F#产生了一些兴趣,但Haskell和LISP在行业中的使用率要高于其他行业。

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

alt text

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

实际上,以上图表可能是一个谎言; “方案”一词可以在编程语言以外的其他环境中出现在帮助广告中。 :)

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

alt text

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

36
Robert Harvey

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

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

18
Larry Coleman

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

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

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

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

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

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

16
JasonTrue

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

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

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

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

10
Erik

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

我最终选择了 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可能更适合您。

  • Cutting Edge-Clojure的发展非常迅速,并且有很多创新在进行-缺点是有很多实验,一些库和工具仍然不成熟,Clojure主要版本之间偶尔会有重大变化,需要您注意。

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

9
mikera

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

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

6
Zeke