我从小就被教 java,在过去的几年里,我开始使用流行的开源 CMS 学习很多 PHP。我真的很喜欢 OOP 的自然感觉,但我最近发现了函数式编程的概念,这似乎是一种困难但优雅的做事方式。
在rtperson对“什么是函数式、声明式和命令式编程?[关闭] ”这个问题的精彩回答中,他说“然后是面向对象的编程,这实际上只是一种在命令式程序中组织数据的新方法。 "
我想我明白他的意思,但这是真的吗?OOP 可以与函数式编程共存吗?
我从小就被教 java,在过去的几年里,我开始使用流行的开源 CMS 学习很多 PHP。我真的很喜欢 OOP 的自然感觉,但我最近发现了函数式编程的概念,这似乎是一种困难但优雅的做事方式。
在rtperson对“什么是函数式、声明式和命令式编程?[关闭] ”这个问题的精彩回答中,他说“然后是面向对象的编程,这实际上只是一种在命令式程序中组织数据的新方法。 "
我想我明白他的意思,但这是真的吗?OOP 可以与函数式编程共存吗?
是的,有一个术语“对象函数式编程”。基本上在这些语言中,函数是“一等公民”——一个对象。
我想大多数人都同意,仅仅因为你必须了解所有概念——函数式、OO 和命令式,所以要做到这一点并不容易。
此类语言的示例是:
是的,它是兼容的。您可以使用任何语言以功能方式进行编程。一个示例是 Java String,它是不可变的,如果您更改方法(例如更改大小写等),则返回一个新对象。
如果您认为它o.something(y)
是公正的osomething(o, y)
,并且如果您不变异o
或不产生与 OO 无关的其他副作用,那么它就是功能性的。
是的。有一种叫做“功能对象”的东西,它基本上是一个对象,其中 mutator 方法不是改变对象的状态,而是返回一个具有修改状态的新对象。Clean 将该想法与唯一性类型相结合,以保持修改后的状态为单线程,这允许编译器通过在后台修改对象的存储来实现方法。
此外,可变状态并没有使它“不是纯粹的功能性”。不纯的是当普通表达式求值改变程序可见的状态时。因此,您可以通过使对象的方法返回 IO monad(或任何其他有状态的 monad)中的操作来组合 OO 和纯函数式编程,这些操作会改变一组通用的底层状态(对程序的其余部分不可用)。