到目前为止,我主要接触到OO编程,并期待学习一种函数式语言。我的问题是:
发布于 2010-01-17 01:47:29
你什么时候选择函数式编程而不是面向对象?
当您预料到不同类型的软件进化时:
当进化走错方向时,你就会遇到问题:
这个问题多年来一直是众所周知的;1998年,菲尔·瓦德勒称其为“表达问题”。。尽管一些研究人员认为混合语言等语言特征可以解决表达问题,但一个被广泛接受的解决方案尚未进入主流。
什么是典型的问题定义,其中函数式编程是一个更好的选择?
函数语言擅长以树的形式处理符号数据。另一个最受欢迎的例子是编译器,在编译器中,源代码和中间语言很少发生变化(大多数情况相同),但是编译器编写人员总是添加新的翻译和代码改进或优化(对事物的新操作)。更普遍的编译和翻译是功能语言的“杀手应用程序”。
发布于 2010-01-16 21:39:21
你不一定要在这两种模式之间做出选择。您可以使用许多功能概念使用OO体系结构编写软件。、FP和OOP在自然中是正交的。
以C#为例。您可以说它主要是OOP,但是有许多FP概念和构造。如果考虑 Linq ,允许Linq存在的最重要的构造本质上是功能性的:lambda表达式。
另一个例子,F#。您可以说它主要是FP,但是有许多OOP概念和构造可用。您可以定义类、抽象类、接口、处理继承。您甚至可以在代码变得更清晰或显着提高性能时使用可变。
许多现代语言都是多范式的.
推荐读数
由于我在同一条船上(OOP背景,学习FP),我建议你阅读一些我真的很感激的东西:
发布于 2010-01-17 12:07:10
面向对象编程提供:
函数式编程,在Haskell中,甚至在Scala中,都可以通过更通用的类型类机制来允许替换。可变的内部状态要么被阻止,要么被禁止。还可以实现内部表示的封装。关于一个很好的比较,请参阅Haskell对OOP。
诺曼的断言“向一个功能程序添加一种新的东西可能需要编辑许多函数定义来添加一个新的情况”。取决于函数代码如何使用类型类。如果特定抽象数据类型上的模式匹配分布在整个代码库中,那么您确实会遇到这个问题,但这可能是一个糟糕的设计。
编辑的在讨论类型类时删除了对隐式转换的引用。在Scala中,类型类是用隐式参数编码的,而不是转换,尽管隐式转换是实现兼容类型替换的另一种方法。
https://stackoverflow.com/questions/2078978
复制相似问题