面向对象的编程是否与函数式编程兼容?

时间:2015-06-26 07:03:13

标签: oop functional-programming imperative-programming

我从小就被java教过,在过去的几年里我使用流行的开源CMS开始学习很多PHP。我真的很喜欢OOP的自然感觉,但我最近发现了函数式编程的概念,这似乎是一种困难但优雅的做事方式。

rtperson对问题" What is functional, declarative and imperative programming? [closed]"的完美回答中,他说"那么那就是面向对象的编程,这实际上只是一种在命令式计划中组织数据的新方法。"

我想我理解他的意思,但这是否真的如此? OOP可以与函数式编程共存吗?

3 个答案:

答案 0 :(得分:1)

是的,有一个术语是“对象功能编程”。 基本上在这些语言中,函数是“一等公民” - 一个对象。

我想大多数人都同意,只是因为你必须了解所有概念 - 功能性,OO和命令性而不是那么容易实现。

此类语言的示例如下:

  • Scala(我非常喜欢)
  • Boost :: function,Boost :: bind in C ++
  • .NET F#
  • javascript(又名ECMAScript)

答案 1 :(得分:1)

是的,它是兼容的。您可以使用任何语言以功能方式进行编程。一个例子是Java String,它是不可变的,并且如果你改变诸如改变大小写等方法,则返回一个新对象。

如果您考虑它o.something(y)只是osomething(o, y),如果您不改变o或做其他与OO无关的副作用,那么它是有效的。

答案 2 :(得分:0)

是。有一种称为“功能对象”的东西,它基本上是一个对象,其中mutator方法返回一个具有修改状态的新对象,而不是改变对象的状态。 Clean将该想法与唯一性类型相结合,以使修改后的状态保持单线程,这允许编译器通过修改幕后对象的存储来实现方法。

此外,没有任何关于可变状态使其“不是纯粹的功能”;普通表达式评估会改变程序可见的状态,这是不纯的。因此,您可以通过使对象的方法返回IO monad(或任何其他有状态monad)中的操作来组合OO和纯函数式编程,这些操作会改变一组常见的基础状态(不可用于程序的其余部分)。