有人可以向我解释为什么我需要函数式编程而不是OOP吗?

时间:2011-01-14 09:53:10

标签: oop programming-languages functional-programming paradigms

  

可能重复:
  Functional programming vs Object Oriented programming

有人可以向我解释为什么我需要功能编程而不是OOP吗?

E.g。为什么我需要使用Haskell而不是C ++(或类似的语言)?

函数式编程优于OOP的优势是什么?

3 个答案:

答案 0 :(得分:14)

我更喜欢功能性编程中的一件大事就是缺乏“远距离的怪异动作”。你所看到的就是你得到的 - 而不是更多。这使得代码更容易推理。

让我们用一个简单的例子。假设我在Java(OOP)或Erlang(功能)中遇到代码片段X = 10。在Erlang中,我可以很快地了解这些事情:

  1. 变量X位于我所处的直接上下文中。期间。它是传入我正在阅读的函数的参数,或者是被分配了第一个(以及仅在下面的c.f.)时间。
  2. 从此时起,变量X的值为10。它在我正在阅读的代码块中不会再次改变。它不能。
  3. 在Java中它更复杂:

    1. 变量X可能被定义为参数。
    2. 可能会在方法的其他位置定义。
    3. 它可能被定义为该方法所在类的一部分。
    4. 无论如何,因为我没有在这里宣布,我正在改变它的价值。这意味着我不知道X的值是什么,如果没有不断地向后扫描代码以找到它被显式或隐式分配或修改的最后位置(如在for循环中)。
    5. 当我调用另一个方法时,如果X碰巧是一个类变量,它可能会从我下面改变,我无法在不检查该方法的代码的情况下知道这一点。
    6. 在线程程序的情况下,情况更糟。 X可以通过我在我眼前的环境中看不到的东西来改变。另一个线程可能正在调用#5中修改X
    7. 的方法

      Java是一种相对简单的 OOP语言。在{+ C ++中X可以解决的方式的数量甚至更高,可能更加模糊。

      事情是?这只是一个简单的示例,说明在OOP(或其他命令式)语言中常见操作如何比在函数中复杂得多。它也没有解决不涉及可变状态等功能编程的好处,例如高阶函数。

答案 1 :(得分:5)

答案 2 :(得分:1)

如果我们比较Haskell和C ++,函数式编程会使调试变得非常容易,因为没有可变状态和变量,比如在C,Python等中找到的变量,你应该一直关注这些变量,并且确保给定一些参数,尽管你评估它的次数,函数总会返回相同的结果。

OOP与任何编程范例都是正交的,并且有一些将FP与OOP结合起来的语言,OCaml是最受欢迎的several Haskell implementations等。