回答:
Wikipedia上有一篇有关函数式编程的出色文章 ,其中包含您要求的一些示例。@Konrad Rudolph已经提供了有关OOP文章的链接。
我不认为一个范例是另一个范例的超集。它们是编程的不同观点,某些问题可以从一个角度更好地解决,而另一些问题则可以从另一个角度更好地解决。
FP和OOP的所有实现都会使您的问题更加复杂。每种语言都有自己的怪癖,与您对问题的任何良好答案都有关。
切线扰动越来越多:
我喜欢这样的想法:像Scala这样的语言试图为您提供两全其美的体验。我担心这也会给您带来两个世界的麻烦。
Java是一种OO语言,但是版本7添加了“尝试资源”功能,该功能可用于模仿一种封闭方式。在这里,它模仿在另一个函数的中间更新局部变量“ a”,而不使该变量对该函数可见。在这种情况下,另一个函数的前半部分是ClosureTry()构造函数,后半部分是close()方法。
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
输出:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
这对于打开流,写入流并可靠地关闭流的预期目的很有用,或者用于简单地将两个函数配对,以使您在它们之间做完一些工作后就不会忘记调用第二个函数。当然,它是如此新奇且不寻常,以至于另一个程序员可能在没有意识到自己破坏了某些东西的情况下删除了try块,因此它目前是一种反模式,但有趣的是它可以做到。
您可以使用大多数命令式语言将任何循环表示为递归。可以使对象和变量不变。可以编写过程以最大程度地减少副作用(尽管我认为在计算机上不可能实现真正的功能-执行所花费的时间以及所消耗的处理器/磁盘/系统资源是不可避免的副作用)。某些功能语言也可以做很多(即使不是全部)面向对象的操作。它们不必相互排斥,尽管某些语言具有阻止某些模式(如可变字段)的限制(例如不允许对变量进行任何更新)。
对我而言,面向对象编程最有用的部分是数据隐藏(封装),将足够多的相似对象视为相同(多态),并收集数据和对这些数据一起操作的方法(对象/类)。继承可能是OOP的旗舰,但对我而言,它是最不重要且使用最少的部分。
函数式编程中最有用的部分是不变性(令牌/值而不是变量),函数(无副作用)和闭包。
我不认为它是面向对象的,但是我不得不说,计算机科学中最有用的事情之一是能够声明一个接口,然后具有各种功能和数据来实现该接口。我还喜欢处理一些可变的数据,所以我想我对完全使用函数式语言并不完全满意,即使我试图限制所有程序设计中的可变性和副作用。