【问题标题】:Is object-orientated programming compatible with functional programming?面向对象编程与函数式编程兼容吗?
【发布时间】:2015-09-13 00:57:12
【问题描述】:

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

rtperson 对问题“What is functional, declarative and imperative programming? [closed]”的精彩回答中,他说“然后是面向对象的编程,这实际上只是一种在命令式程序中组织数据的新方法。”

我想我明白他的意思,但这是真的吗? OOP 可以与函数式编程共存吗?

【问题讨论】:

  • 是的。例如 Scala 和 OCaml。
  • 更多的例子是 F# 和 Swift。
  • 是的,但是 OOP 永远不可能是 purely functional,因为每个定义的对象都包含状态。对于设计良好的纯函数式语言,我建议看看 Haskell
  • 顺便说一句,我发现second answer 与您链接的问题比 rtperson 的问题更精确,这并不准确。
  • @StenSoft:并不总是更快……

标签: oop functional-programming imperative-programming


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我想大多数人都同意,仅仅因为您必须了解所有概念 - 函数式、OO 和命令式,这并不容易。

      此类语言的示例如下:

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

      【讨论】:

      • 既然Java 8 Java也是一种OF语言,当然C++也是如此>11
      猜你喜欢
      • 2023-03-21
      • 2011-11-16
      • 2010-12-21
      • 2010-09-18
      • 1970-01-01
      • 2010-11-04
      • 2018-08-02
      • 2016-04-22
      • 1970-01-01
      相关资源
      最近更新 更多