函数式编程语言的好处和用途

adv*_*ait 11 lisp ocaml programming-languages functional-programming

可能重复:
为何选择函数式语言?

我开始用C/C++,VB和最终的Python编程 - 所有命令式语言.我参加了一门关于编程语言的课程并学习了我的第一个函数式语言 - OCaml.太可怕了.

除了语法和其他恐怖之外,OCaml采用了我的命令式思维过程并将其抛到了窗外.这令人沮丧.我坚持认为,所有可以在功能上完成的事情也可以强制执行.我认为函数式编程是命令式编程而没有肢体(副作用).为了回应我的沮丧,我的教授可以提出的唯一好处是FPL能够并行化无副作用的功能.

无论如何,足够的谈话.

  1. FPL在IPL之上提供了哪些优势?
  2. 在FPL中是否可以轻松完成任何无法在IPL中轻松完成的事情?
  3. 是否有任何真实的FPL使用示例,或者它们主要用作学术练习?(当我说真实世界时,我的意思是一个严重依赖于语言功能方面的项目,并且不会将FPL塞进不属于它的场景中).

谢谢,
Advait

Gia*_*ian 14

首先,几乎所有现在常用的语言都具有相似的表达能力,无论是命令式的还是功能性的,所以很自然地认为你可以用函数式语言做的任何事情你都可以在命令式语言中做,因为它可能是真的.

关于函数式语言的一个非常好的事情是它们的结构允许应用Hindley-Milner类型的推理.这是SML,OCaml和一堆其他函数语言中使用的类型系统.它真的似乎可以降低错误率,并且能够通过预先发现错误作为编译错误来节省大量的时间和精力.

自动并行化参数有点过度使用,特别是因为承诺根本没有最终结果.我已经在函数式语言中明确地编写了并行代码,并且它比使用Java等类似的东西更好.

至少有趣的是,我不会是第一个声称学习函数式语言使你成为更好的命令式程序员的人!在使用OCaml时,让您的"命令式"思维过程中断时感到的不适实际上是一个非常好的过程.它会让你质疑假设并阻止你以特定的方式编写代码,因为你总是这样做.

至于实际使用,您可能希望查看功能编程工作坊的商业用户的会议记录.还有一些非常大的项目用各种函数式语言编写,尽管大多数项目在相对较小的社区之外可能有限.定理证明Coq和Isabelle分别用Ocaml和SML编写.

无论你做什么,我都会坚持下去.在事情最终被点击之前,我花了很长时间对ML进行敲击.这些天我不确定我是否记得Java或C是如何工作的,因为我很久没有需要它了......我只是使用ML!

  • 是的,我同意非功能性要求应该影响语言选择.我对原始问题的解读非常符合标准商品硬件的日常编程框架,但如果情况并非如此,那么情况会有所改变.也就是说,有一些非常适合嵌入式编程的函数式语言:) (2认同)

Mau*_*Mau 7

  1. 当一个人最终设法使他的训练有素(错误)训练的头脑沉默时,FP实际上变得比IP更容易和更有趣.

  2. 由于其声明性,FP倾向于更安全,更不容易出错.

  3. 我喜欢认为并行化命令式代码会使其复杂性增加一倍(尝试使用非平凡的并行应用程序).由于在许多情况下缺乏同步,IMO,FP大大缩小了差距.

  4. 引用Gian,学习FP让你成为一个更聪明的命令式程序员......

  • 关于第2点的实际数据并不多.这主要是期望.如果你看飞机上的计算机,他们可能会使用Ada,这是一种典型的命令式语言.用飞行计算机上实际运行的FP语言(OCAML,Haskell,...)编写的可比代码量可能接近于零.使用FP语言的唯一地方是验证命令式程序,FP代码仍未在飞行计算机上运行.它们可能是例外,但几乎所有真实世界的安全代码都不是这些语言中的一种,您希望它们更安全或更不容易出错. (3认同)
  • @ rainer-joswig:他们使用Ada是因为它在30年前获得批准,没有人愿意为改变"规则"而烦恼.性能和运行时验证也是一个问题:命令式语言使"更容易"的编译器成为可能. (2认同)