与面向对象编程相比,函数式编程最重要的 philosophy/concept 是什么?

What is most important philosophy/concept of functional programming compared to object-oriented programming?

对我来说,OOP 完全是关于 自治,这是通过两个主要概念实现的:(1) 封装 和 (2) 消息传递.

现在正在学习FP,想弄明白:

能否分享一下您对 FP 范式的见解?谢谢!

OP 中为 OOP 列出的大多数特征也适用于 FP - 也许继承除外。

但即便如此,某些 functional-first 语言(例如 F#)支持继承,并且 some object-oriented languages don't have inheritance.

对于 OOP 的确切构成,没有单一的、公认的定义,FP 也是如此。我在我的文章 Functional architecture: a definition 中对此进行了讨论,其中我还假设 FP 的定义特征是 参照透明性

FP 的许多其他 well-known 特征(不变性、higher-order 函数、闭包等)直接或间接源于对引用透明性的强调。一些典型的 FP 陷阱如 monads 也可以说起源于引用透明性,但主要是因为它们成功解决了一些由引用透明性引起的问题(例如 hos 在执行复杂计算时保持状态,这可以由 State monad 解决)。

对于 FP,仍有不同的看法。只是比较 Clojure to Haskell。这些语言都被他们的社区认为是功能性的,但它们仍然非常不同。 OP 中建议的许多特征(类型 类,代数数据类型)对于 Haskell 是典型的,但在 Clojure 中并不是真正的东西,因为 Clojure 是动态类型的。

另一方面,Clojure 强调典型的 Lisp-like 属性,如 homoiconicity 和宏,并且它的社区支持动态类型。 (不过,请注意,我对 Haskell 的了解比对 Clojure 的了解要多得多。)