迄今为止,我主要接触过面向对象编程,现在期待学习一门函数式编程语言。我的问题是:
- 你在什么时候选择函数式编程而不是面向对象编程?
- 在哪些典型问题定义中,函数式编程是更好的选择?
迄今为止,我主要接触过面向对象编程,现在期待学习一门函数式编程语言。我的问题是:
函数式语言在操作树形符号数据方面表现出色。编译器是一个常见的例子,其中源语言和中间语言很少改变(大多数情况下是相同的“事物”),但编译器编写人员始终在添加新的翻译和代码改进或优化(对“事物”的新操作)。编译和翻译更普遍地说是函数式语言的“杀手级应用程序”。什么是函数式编程更好的选择的典型问题定义?
您不必在两种范例之间做出选择。您可以使用许多功能概念编写具有OO架构的软件。 FP和OOP在本质上是正交的。
以C#为例。你可以说它主要是面向对象的,但有许多FP概念和结构。如果你考虑Linq,允许存在Linq的最重要的结构是功能性的: lambda表达式。
另一个例子是F#。你可以说它主要是FP的,但有许多OOP概念和结构可用。你可以定义类、抽象类、接口、处理继承。甚至当代码更清晰或显著提高性能时,你可以使用可变性。
许多现代语言都是多范例的。
由于我处于同样的情况(OOP背景,学习FP),我建议您阅读我非常欣赏的一些文章:
Functional Programming for Everyday .NET Development, 作者Jeremy Miller. 一篇伟大的文章(虽然格式不佳),展示了C#中许多技术和实际的、现实世界中FP的例子。
Real-World Functional Programming, 作者Tomas Petricek. 一本主要涉及FP概念的伟大书籍,试图解释它们是什么,应该在何时使用。其中有许多F#和C#的例子。此外,Petricek的博客 是一个很好的信息来源。
面向对象编程提供:
在Haskell甚至Scala中,函数式编程可以通过更一般的类型类机制进行替换。可变内部状态要么被不鼓励或禁止。还可以实现内部表示的封装。请参阅 Haskell vs OOP 进行良好的比较。
Norman声称“向函数式程序添加新类型可能需要编辑多个函数定义以添加新情况。”这取决于函数式代码如何使用类型类。如果在代码库中分布了特定抽象数据类型的模式匹配,那么您确实会遇到此问题,但这可能是一个设计失误。
已编辑 在讨论类型类时删除了隐式转换的引用。在Scala中,类型类是用隐式参数编码的,而不是转换,虽然隐式转换是实现可互换类型的另一种手段。
如果您处于高度并发的环境中,那么纯函数式编程是很有用的。缺乏可变状态使得并发几乎变得微不足道。请查看 Erlang。
在多范式语言中,如果可变状态的存在只是实现细节,因此函数式编程是问题领域的一个好模型。例如,请参见 Python 中的列表推导式或 D 编程语言中的 std.range。它们受到函数式编程的启发。