Oop 面向对象编程与函数式编程兼容吗?

Oop 面向对象编程与函数式编程兼容吗?,oop,functional-programming,imperative-programming,Oop,Functional Programming,Imperative Programming,我是在教java的环境中长大的,在过去的几年里,我使用流行的开源CMS学习了很多PHP。我真的很喜欢OOP的自然感觉,但我最近发现了函数式编程的概念,这似乎是一种困难但优雅的做事方式 在《对问题的伟大回答》一书中,他说“然后是面向对象编程,它实际上只是在命令式程序中组织数据的一种新方法。” 我想我理解他的意思,但这完全是真的吗?OOP能与函数式编程共存吗?是的,有一个术语叫“对象函数式编程”。 在这些语言中,函数基本上是“一等公民”——一个对象 我想大多数人都同意,要做到这一点并不容易,因为你必

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

在《对问题的伟大回答》一书中,他说“然后是面向对象编程,它实际上只是在命令式程序中组织数据的一种新方法。”

我想我理解他的意思,但这完全是真的吗?OOP能与函数式编程共存吗?

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

我想大多数人都同意,要做到这一点并不容易,因为你必须了解所有的概念——功能、面向对象和命令

这类语言的例子如下:

  • 斯卡拉(我非常喜欢)
  • C中的Boost::function、Boost::bind++
  • .NETF#
  • javascript(又称ECMAScript)

是的,它是兼容的。您可以用任何语言以函数方式编程。一个例子是Java字符串,它是不可变的,如果您更改方法(如change case等),它将返回一个新对象


如果你想一想,某个东西(y)只是
o方法学(o,y)
如果你没有变异
o
或做其他与OO无关的副作用,它就起作用了

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


此外,可变状态并没有让它“不完全起作用”;当普通表达式求值改变程序可见的状态时,不纯的是。因此,您可以通过使对象的方法在IO单子(或任何其他有状态单子)中返回操作来将OO和纯函数编程结合起来,这些操作会改变一组通用的底层状态(程序的其余部分不可用)。

是。例如Scala和OCaml。还有一些例子是F#和Swift.yes,但OOP永远不能是这样,因为每个定义的对象都包含状态。对于一种设计良好的纯函数式语言,我建议看一看Haskell BTW,我发现您所链接的问题比rtperson的问题更精确,而rtperson的问题并不真正准确。@StenSoft:它并不总是更快……因为Java 8 Java当然也是一种语言,就像C++>11一样