Responder:
Wikipedia tiene un excelente artículo sobre programación funcional con algunos de los ejemplos que solicita. @Konrad Rudolph ya proporcionó el enlace al artículo de OOP .
No creo que un paradigma sea un superconjunto del otro. Son diferentes perspectivas sobre la programación y algunos problemas se resuelven mejor desde una perspectiva y otros desde otra.
Su pregunta se complica aún más por todas las implementaciones de FP y OOP. Cada idioma tiene sus propias peculiaridades que son relevantes para cualquier buena respuesta a su pregunta.
Divagación cada vez más tangencial:
Me gusta la idea de que un lenguaje como Scala intente darte lo mejor de ambos mundos. Me preocupa que también te dé las complicaciones de ambos mundos.
Java es un lenguaje OO, pero la versión 7 agregó una función de "prueba con recursos" que puede usarse para imitar una especie de cierre. Aquí imita la actualización de una variable local "a" en el medio de otra función, sin que sea visible para esa función. En este caso, la primera mitad de la otra función es el constructor Closure Try () y la segunda mitad es el método 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...");
}
}
Salida:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Esto podría ser útil para su propósito de abrir una secuencia, escribir en la secuencia y cerrarla de manera confiable, o simplemente para emparejar dos funciones de una manera que no se olvide de llamar a la segunda después de hacer un trabajo entre ellas. . Por supuesto, es tan nuevo e inusual que otro programador podría eliminar el bloque de prueba sin darse cuenta de que está rompiendo algo, por lo que actualmente es una especie de antipatrón, pero es interesante que se pueda hacer.
Puede expresar cualquier bucle en la mayoría de los idiomas imperativos como una recursividad. Los objetos y las variables pueden hacerse inmutables. Se pueden escribir procedimientos para minimizar los efectos secundarios (aunque yo diría que una verdadera función no es posible en una computadora: el tiempo que lleva ejecutar y los recursos del procesador / disco / sistema que consume son efectos secundarios inevitables). Se puede hacer que algunos lenguajes funcionales también realicen muchas, si no todas, las operaciones orientadas a objetos. No tienen que ser mutuamente excluyentes, aunque algunos lenguajes tienen limitaciones (como no permitir ninguna actualización de variables) que impiden ciertos patrones (como los campos mutables).
Para mí, las partes más útiles de la programación orientada a objetos son la ocultación de datos (encapsulación), el tratamiento de objetos suficientemente similares como el mismo (polimorfismo) y la recopilación de sus datos y métodos que operan en esos datos juntos (objetos / clases). La herencia puede ser el buque insignia de OOP, pero para mí es la parte menos importante y menos utilizada.
Las partes más útiles de la programación funcional son la inmutabilidad (tokens / valores en lugar de variables), funciones (sin efectos secundarios) y cierres.
No creo que esté orientado a objetos, pero tengo que decir que una de las cosas más útiles en informática es la capacidad de declarar una interfaz, luego tener varias piezas de funcionalidad y datos para implementar esa interfaz. También me gusta tener algunos datos mutables con los que trabajar, así que supongo que no me siento totalmente cómodo en lenguajes exclusivamente funcionales, aunque trato de limitar la mutabilidad y los efectos secundarios en todos los diseños de mis programas.