与面向对象编程相比,函数式编程最重要的 philosophy/concept 是什么?
What is most important philosophy/concept of functional programming compared to object-oriented programming?
对我来说,OOP 完全是关于 自治,这是通过两个主要概念实现的:(1) 封装 和 (2) 消息传递.
- 概念(如子类型化、后期绑定、多重分派、接口和实现、原型、访问修饰符、构造函数和析构函数等)是支持封装和消息传递的机制。
- 概念(如责任、开闭原则、依赖注入、创建-使用分离等)是设计好的对象的准则。
现在正在学习FP,想弄明白:
- FP 是关于
[MASK]
的,主要概念是:(1) Referential Transparency,以及 [MASK]*
- 概念(如不变性、闭包和高阶函数、延续、代数数据类型、分类类型类或特征……)是支持这些主要概念的机制吗?
- 好的功能的重要设计准则是什么?我认为数据行为分离将是其中之一,但不确定...
能否分享一下您对 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 的了解要多得多。)
对我来说,OOP 完全是关于 自治,这是通过两个主要概念实现的:(1) 封装 和 (2) 消息传递.
- 概念(如子类型化、后期绑定、多重分派、接口和实现、原型、访问修饰符、构造函数和析构函数等)是支持封装和消息传递的机制。
- 概念(如责任、开闭原则、依赖注入、创建-使用分离等)是设计好的对象的准则。
现在正在学习FP,想弄明白:
- FP 是关于
[MASK]
的,主要概念是:(1) Referential Transparency,以及[MASK]*
- 概念(如不变性、闭包和高阶函数、延续、代数数据类型、分类类型类或特征……)是支持这些主要概念的机制吗?
- 好的功能的重要设计准则是什么?我认为数据行为分离将是其中之一,但不确定...
能否分享一下您对 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 的了解要多得多。)