Menjawab:
Wikipedia memiliki artikel yang bagus tentang Pemrograman Fungsional dengan beberapa contoh yang Anda minta. @Konrad Rudolph sudah menyediakan tautan ke artikel OOP .
Saya tidak berpikir satu paradigma adalah super-set yang lain. Mereka adalah perspektif yang berbeda pada pemrograman dan beberapa masalah lebih baik diselesaikan dari satu perspektif dan beberapa dari yang lain.
Pertanyaan Anda semakin rumit dengan semua implementasi FP dan OOP. Setiap bahasa memiliki kebiasaan sendiri yang relevan dengan jawaban yang baik untuk pertanyaan Anda.
Rambling Semakin Tangensial:
Saya suka gagasan bahwa bahasa seperti Scala mencoba memberi Anda yang terbaik dari kedua dunia. Saya khawatir itu memberi Anda komplikasi dari kedua dunia juga.
Java adalah bahasa OO, tetapi versi 7 menambahkan fitur "coba-dengan-sumber daya" yang dapat digunakan untuk meniru semacam penutupan. Di sini ia meniru memperbarui variabel lokal "a" di tengah fungsi lain, tanpa membuatnya terlihat oleh fungsi itu. Dalam hal ini bagian pertama dari fungsi lainnya adalah konstruktor ClosureTry () dan bagian kedua adalah metode 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...");
}
}
Keluaran:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Ini bisa berguna untuk tujuan yang dimaksudkan membuka aliran, menulis ke aliran, dan menutupnya dengan andal, atau untuk hanya memasangkan dua fungsi dengan cara yang Anda tidak lupa untuk memanggil yang kedua setelah melakukan beberapa pekerjaan di antara mereka . Tentu saja, ini sangat baru dan tidak biasa sehingga programmer lain dapat menghapus blok try tanpa menyadari mereka melanggar sesuatu, jadi saat ini semacam anti-pola, tetapi menarik bahwa itu dapat dilakukan.
Anda dapat mengekspresikan loop apa saja dalam sebagian besar bahasa imperatif sebagai rekursi. Objek dan variabel dapat dibuat tidak berubah. Pengadaan dapat ditulis untuk meminimalkan efek samping (walaupun saya berpendapat bahwa fungsi sebenarnya tidak mungkin pada komputer - waktu yang diperlukan untuk mengeksekusi dan sumber daya prosesor / disk / sistem yang digunakannya adalah efek samping yang tidak dapat dihindari). Beberapa bahasa fungsional dapat dibuat untuk melakukan banyak jika tidak semua operasi berorientasi objek juga. Mereka tidak harus saling eksklusif, meskipun beberapa bahasa memiliki batasan (seperti tidak mengizinkan pembaruan variabel) yang mencegah pola tertentu (seperti bidang yang bisa berubah).
Bagi saya, bagian yang paling berguna dari pemrograman berorientasi objek adalah penyembunyian data (enkapsulasi), memperlakukan objek yang cukup mirip dengan yang sama (polimorfisme), dan mengumpulkan data dan metode yang beroperasi pada data tersebut bersama-sama (objek / kelas). Warisan mungkin merupakan andalan OOP, tetapi bagi saya itu adalah bagian yang paling tidak penting dan paling jarang digunakan.
Bagian yang paling berguna dari pemrograman fungsional adalah ketidakmampuan (token / nilai alih-alih variabel), fungsi (tidak ada efek samping), dan penutupan.
Saya tidak berpikir itu berorientasi objek, tetapi saya harus mengatakan bahwa salah satu hal yang paling berguna dalam ilmu komputer adalah kemampuan untuk mendeklarasikan sebuah antarmuka, kemudian memiliki berbagai fungsi dan data mengimplementasikan antarmuka itu. Saya juga suka memiliki beberapa bagian data yang bisa berubah untuk dikerjakan, jadi saya kira saya tidak sepenuhnya nyaman dalam bahasa yang hanya berfungsi secara eksklusif, meskipun saya mencoba membatasi mutabilitas dan efek samping dalam semua desain program saya.