Відповідь:
У Вікіпедії є чудова стаття про функціональне програмування з деякими прикладами, про які ви просите. @Konrad Rudolph вже надав посилання на статтю про ООП .
Я не думаю, що одна парадигма - це супер набір іншої. Вони різні точки зору на програмування, і деякі проблеми краще вирішити з одного погляду, а деякі з іншого.
Ваше питання ще більше ускладнюється всіма реалізаціями FP та OOP. Кожна мова має свої примхи, які відповідають будь-якій добрій відповіді на ваше запитання.
Все більш тангенціальне Rambling:
Мені подобається думка, що така мова, як Скала, намагається дати тобі найкраще з обох світів. Я хвилююся, що це дає вам і ускладнення обох світів.
Java є мовою ОО, але версія 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
Це може бути корисним за призначенням відкрити потік, записати в потік і надійно закрити його або просто зв'язати дві функції таким чином, що ви не забудете викликати другу після виконання певної роботи між ними . Звичайно, він настільки новий і незвичний, що інший програміст може видалити блок проб, не усвідомлюючи, що вони щось порушують, тому наразі це такий собі антидіапазон, але цікаво, що це можна зробити.
Ви можете виразити будь-яку петлю на більшості імперативних мов як рекурсію. Об'єкти та змінні можна зробити незмінними. Процедури можна записати для мінімізації побічних ефектів (хоча я заперечую, що справжня функція на комп’ютері неможлива - час, необхідний для виконання, і процесор / диск / системні ресурси, які він споживає, неминучі побічні ефекти). Деякі функціональні мови можна зробити для багатьох, якщо не всіх об'єктно-орієнтованих операцій. Вони не повинні бути взаємовиключними, хоча деякі мови мають обмеження (наприклад, не дозволяють оновлювати змінні), що запобігають певним шаблонам (наприклад, поля, що змінюються).
Для мене найбільш корисними частинами об'єктно-орієнтованого програмування є приховування даних (інкапсуляція), обробка достатньо подібних об'єктів як однакових (поліморфізм) та збирання ваших даних та методів, які працюють над цими даними разом (об'єкти / класи). Спадщина може бути флагманом ООП, але для мене це найменш важлива і найменш використана частина.
Найбільш корисними частинами функціонального програмування є незмінність (лексеми / значення замість змінних), функції (відсутність побічних ефектів) та закриття.
Я не думаю, що це об'єктно-орієнтоване, але я мушу сказати, що одна з найкорисніших речей в інформатиці - це можливість оголосити інтерфейс, а потім мати різні функції і дані реалізувати цей інтерфейс. Мені також подобається мати декілька змінних фрагментів даних, з якими я можу працювати, тому, мабуть, мені не зручно в виключно функціональних мовах, хоча я намагаюся обмежити зміни та побічні ефекти у всіх своїх програмах.