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

3
我从小就学习Java,并在过去几年中开始学习使用流行的开源CMS许多PHP。我真的很喜欢面向对象编程的自然感觉,但是最近我发现了函数式编程的概念,这似乎是一种困难但优雅的做事方式。
rtperson 对问题“什么是函数式、声明式和命令式编程?[已关闭]”的精彩回答中,他说:“然后还有面向对象编程,它实际上只是一种在命令式程序中组织数据的新方法。”
我想我理解他的意思,但这严格来说是真的吗?面向对象编程可以与函数式编程共存吗?

1
是的。例如Scala和OCaml。 - ReyCharles
1
还有一些例子是 F# 和 Swift。 - molbdnilo
1
是的,但面向对象编程永远不能是纯函数式的,因为对象根据定义包含状态。对于设计良好的纯函数式语言,我建议看看 Haskell。 - mb21
顺便说一句,我发现你链接的问题中的第二个答案比rtperson的更加精确,而他的回答并不准确。 - mb21
1
@StenSoft:并不总是更快... - Holger
显示剩余3条评论
3个回答

1
是的,有一个术语叫做“对象函数式编程”。 基本上,在这些语言中,函数是“一等公民”- 也就是一个对象。
我想大多数人都同意,要达到这个水平并不容易,因为你必须了解所有的概念- 函数式,面向对象和命令式。
这样的语言示例包括:
  • Scala(我非常喜欢)
  • C++中的Boost :: function,Boost :: bind
  • .NET F#
  • javascript(又名ECMAScript)

自Java 8以来,Java也是一种OF语言,当然,C++>11也是。 - Martin Meeser

1

是的,它是兼容的。您可以在任何语言中以函数式编程的方式进行编程。例如Java String是不可变的,如果您执行更改大小写等操作方法,则会返回一个新对象。

如果您考虑一下 o.something(y) 只是 osomething(o, y),如果您不改变 o 或执行与OO无关的其他副作用,那么它就是函数式的。


0

是的。有一种叫做“函数对象”的东西,它基本上是一个对象,其中的改变器方法不会改变对象的状态,而是返回一个具有修改状态的新对象。Clean将这个想法与唯一性类型相结合,以保持修改状态单线程化,这使得编译器可以通过在幕后修改对象的存储来实现方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接