到目前为止,我已经主要接触过OO编程,并期待学习一门函数式语言。 个人问题是: html
您不必定要在两种范例之间进行选择。 您可使用许多功能概念编写具备OO架构的软件。 FP和OOP本质上是正交的 。 git
以C#为例。 你能够说它主要是OOP,但有许多FP概念和结构。 若是考虑Linq ,容许Linq存在的最重要的构造本质上是功能性的: lambda表达式 。 express
另外一个例子,F#。 你能够说它主要是FP,但有许多OOP概念和结构可用。 您能够定义类,抽象类,接口,处理继承。 您甚至能够在使代码更清晰或显着提升性能时使用可变性。 编程
许多现代语言都是多范式的。 架构
由于我在同一条船上(OOP背景,学习FP),我建议你读一些我真的很感激: 并发
Jeremy Miller 为平常.NET开发提供的功能编程 。 一篇很棒的文章(虽然格式不好),展现了C#上FP的许多技术和实际的实际例子。 编程语言
真实世界的功能编程 ,由Tomas Petricek撰写。 一本伟大的书,主要涉及FP概念,试图解释它们是什么,何时应该使用它们。 F#和C#都有不少例子。 此外, Petricek的博客是一个很好的信息来源。 函数式编程
若是您处于高度并发的环境中,那么纯函数式编程就颇有用。 缺少可变状态使得并发几乎是微不足道的。 见Erlang。 函数
在多范式语言中,若是可变状态的存在必须是实现细节,您可能但愿在功能上对某些事物进行建模,所以FP是问题域的良好模型。 例如,请参阅D编程语言中的Python或std.range中的列表推导 。 这些都受到函数式编程的启发。 性能
何时选择面向对象的函数式编程?
当您预期不一样类型的软件演变时:
当你对事物有一套固定的操做时,面向对象的语言是很好的,随着代码的发展,你主要添加新东西。 这能够经过添加实现现有方法的新类来完成,而且现有类保持不变。
当你有一套固定的东西时 ,函数式语言是很好的,随着代码的发展,你主要在现有的东西上添加新的操做 。 这能够经过添加使用现有数据类型计算的新函数来实现,而且现有函数是独立的。
当进化走错路时,你会遇到问题:
向面向对象的程序添加新操做可能须要编辑许多类定义以添加新方法。
在功能程序中添加新类型的东西可能须要编辑许多函数定义来添加新案例。
这个问题多年来一直众所周知; 1998年, Phil Wadler将其称为“表达问题” 。 虽然一些研究人员认为表达问题能够经过mixins这样的语言特性来解决,可是一种被普遍接受的解决方案还没有成为主流。
什么是典型的问题定义,其中函数式编程是更好的选择?
功能语言擅长以树形式操纵符号数据。 最喜欢的例子就是编译器,在源和中间语言改变不多(几乎相同的事情 ),可是编译器做者一直在增长新的翻译和代码改进或优化(对事物的新操做)。 编译和翻译更通常地是功能语言的“杀手级应用”。
面向对象编程提供:
Haskell甚至Scala中的函数式编程能够容许经过类型类的更通用机制进行替换。 不鼓励或禁止可变的内部状态。 还能够实现内部表示的封装。 有关比较,请参阅Haskell与OOP 。
Norman断言“在功能程序中添加新东西可能须要编辑许多函数定义来添加新案例”。 取决于功能代码使用类型类的程度。 若是特定抽象数据类型上的模式匹配遍及整个代码库,您确实会遇到这个问题,但它多是一个糟糕的设计。
EDITED在讨论类型类时删除了对隐式转换的引用。 在Scala中,类型类使用隐式参数进行编码,而不是转换,尽管隐式转换是实现兼容类型替换的另外一种方法。