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

dsi*_*cha 4 programming-languages functional-programming

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

  1. 没有范例是完美的.无论是什么样式,单一范式的语言都是非常严格的.
  2. 当您完成实际工作时,Python或D将使您轻松进入函数式编程.Haskell或Erlang将迫使您在实际做任何感兴趣的事情之前一次性学习功能风格.

编辑:通过"不纯"的函数式语言,我真正的意思是具有功能性的强多语言语言,而不是具有一些非功能性能力的强功能语言.

mfe*_*old 11

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

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

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


Nor*_*sey 11

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

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

实际上,根据你所说的"感兴趣"的含义,你可以在一周内在Haskell中保持高效.

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

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


如果你喜欢Paul Graham,你可以在他的文章Beating the Averages中阅读更多关于这种推理的内容,特别是关于"Blub Paradox"的部分.只需用Haskell代替Lisp :-)


Chu*_*uck 6

如果你的"新"语言只是你已经知道的一个轻微的排列,你就会学得很少.这就像是在问:"为什么我会学习中文,因为我可以让一个方言教练教我和苏格兰式的一个兄弟说话?" 我想如果你喜欢和布洛克说话一样好,但是你并没有真正扩展你的专业知识.

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

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

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