为什么纯函数式语言而不是“不纯”函数式语言?

时间:2009-11-24 22:36:07

标签: programming-languages functional-programming

对于不是理论计算机科学家的人来说,学习像Haskell或Erlang这样的纯函数语言而不是具有强大功能组件的“不纯”语言(如Python或D编程语言的第2版)的优势是什么? ?我的论点如下:

  1. 没有范例是完美的。无论使用什么范例,单一范式的语言都是非常严格的。
  2. Python或D将让您在完成实际工作时轻松进入函数式编程。 Haskell或Erlang将迫使你在实际做任何感兴趣的事情之前,一次性学习功能风格。
  3. 编辑:通过“不纯”的函数式语言,我真正的意思是具有功能性的强多语言语言,而不是具有一些非功能性能力的强功能语言。

5 个答案:

答案 0 :(得分:11)

这一切都取决于想要实现的目标。如果您的目标是用函数式语言编写生产代码 - 一种“纯粹的”函数式语言会使其变得更加困难。

但是如果你正在尝试学习新的概念,那么'纯'语言可以帮助你保护你在功能概念上脱颖而出的地方。一旦你清楚地了解了差异,就可以进入混合环境 - 比如F#,但在此之前很容易陷入OOP的做事方式,因为这会错过功能方法的优势。

在其他一些帖子中,我提出了一个观点,即学习F#的更好方法是先让我们说Haskell(并为此投票),但是如果你学习F#来做OOP而不是重点 - 留下来C#

答案 1 :(得分:11)

你几乎回答了自己的问题:

  

Haskell或Erlang将迫使您在实际做任何感兴趣的事情之前一次性学习功能风格。

实际上,根据您所说的“感兴趣”的含义,您可以在一周内在Haskell中保持高效。

任何人学习Haskell的主要原因(语言理论家已经知道它,而其他类型的理论家太忙于证明定理困扰编程)是学习Haskell会改变你对编程的看法。特别是类型系统,列表推导(被盗为Python - 最高形式的赞美),以及使用模式匹配编程。您将能够在所有编程中使用您的许多新想法。 Haskell将强迫以一种其他语言不会的方式思考新想法。

Erlang是一种光荣的语言,但与Haskell的类型系统没有任何可比性。


如果你喜欢保罗格雷厄姆,你可以在他的论文Beating the Averages中阅读更多关于这种推理的内容,尤其是关于“Blub悖论”的部分。只需用Haskell代替Lisp: - )

答案 2 :(得分:6)

如果你的“新”语言只是你已经知道的一个轻微的排列,那么你几乎没有学到什么。这就像是在问:“为什么我会学习中文,因为我可以让一个方言教练来教我与苏格兰式的一个流氓说话?”我想如果你喜欢和布洛克说话一样好,但是你并没有真正扩展你的专业知识。

学习一门功能语言可以教你一种看待事物的新方法。像OCaml这样的不纯或混合范式的语言也很好,但是使用不纯的元素作为拐杖可能很有诱惑力,以避免以新的方式看待问题。不,函数式语言不是一个神奇的子弹,但它们确实有很多有趣的好处,如果你学习的语言具有“功能组件”但实际上并不真实,那么你就会剥夺自己的好处功能语言。

例如,在像Haskell这样的纯函数式语言中,状态与程序的其余部分非常小心地隔离开来。这使得各种优化变得微不足道,在其他语言中非常难以实现。例如,state是并行处理的敌人。在Haskell中,您可以只看一个函数的类型,并且100%确信它不会产生任何副作用。

这种在使用不可变数据结构的函数中思考的方式是纯函数式语言可以教给你的东西。我不是说纯函数式语言是“最好的”,但它们有它们的好处。这是你腰带上的另一个工具。而且你不会通过坚持熟悉的东西来获得这个工具。

答案 3 :(得分:2)

Erlang纯粹是功能性的吗?老实说,我认为不是。

我不是这方面的专家,所以请耐心等待。

副作用阻止(或使更复杂)大量优化,包括并行性。因此,从理论上讲,实现纯函数应该意味着更好地优化更快的代码,尽管我不确定这在实践中是否正确。即使它没有,也可能有一天......如果出现一种纯粹的功能性语言,这将使所有内核变得容易使用,这将会很有趣。

此外,在某种程度上,没有副作用的编程可以使程序更容易理解。

答案 4 :(得分:1)

因为only pure is declarative处于操作语义级别。纯函数式编程(即消除意外依赖性)是required for parallelism

此外,如果没有不变性限制,您将不会被迫考虑如何使用as fast as they can be done in imperative算法,或者如何使用功能性反应式编程来模拟没有状态意图的现实世界的交互。

因此,您不会最大限度地发挥编写最具可组合性和可扩展性的代码的技能。