functional programming - programacion - Cuándo usar un lenguaje de programación funcional?
programacion funcional ventajas y desventajas (8)
¿En qué situaciones debería elegir usar un lenguaje de programación funcional sobre un lenguaje orientado a objetos más detallado como C ++, C # o Java?
Entiendo qué es la programación funcional, lo que realmente no entiendo es para qué tipos de problemas es una solución perfecta.
Aunque esta es una pregunta bastante subjetiva, me gustaría añadir que los lenguajes funcionales se usan mucho para analizar los lenguajes específicos del dominio ; la naturaleza funcional se presta bien al análisis de gramáticas.
En general, utilice el idioma en el que es más fácil expresar la solución a un problema. Para la programación funcional, es cuando la solución a un problema se expresa fácilmente en términos de funciones , de ahí el nombre. En general, es bueno para operaciones matemáticas, AI, coincidencia de patrones; en general, cualquier cosa que pueda dividirse en un conjunto de reglas que se deben aplicar para obtener una respuesta. Solo puede determinar realmente el "mejor" idioma que debe usar una vez que haya analizado su problema lo suficiente. Aquí es donde el pseudo-código es útil. Si te encuentras escribiendo un pseudo-código que se parece a FP, usa FP.
Por supuesto, todos los lenguajes de programación completos son funcionalmente equivalentes, por lo que no importa realmente cuál elija en términos de qué problemas puede resolver. Los principales efectos serán en términos de eficiencia y precisión de la codificación, y facilidad de mantenimiento.
Tenga en cuenta también que es posible imitar FP en lenguajes OO a través de API inteligentemente diseñadas. Por ejemplo, he visto numerosas bibliotecas de Java (JMock es un ejemplo) que utilizan el método de encadenamiento para simular una FP DSL. Entonces verás construcciones tales como:
logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );
Esto esencialmente crea una función que se evalúa para determinar si alguna secuencia de llamada en un objeto simulado es correcta. (ejemplo robado de http://www.jmock.org/yoga.html )
Otra sintaxis similar a FP en otros lenguajes OO es el uso de cierres, como en Ruby.
Hice algunas investigaciones sobre esto y pensé que podría agregar CONCURRENCIA a la lista de razones para usar un lenguaje funcional. En algún momento, en un futuro cercano, la velocidad del procesador no podrá aumentar con la misma tecnología de CPU. La física de la arquitectura no lo permitirá.
Entonces, es allí donde entra el procesamiento simultáneo.
Desafortunadamente, la mayoría de los lenguajes OOP no pueden aprovechar múltiples procesadores a la vez debido a las interdependencias entre los datos.
En lenguajes de programación funcionales puros, la computadora puede ejecutar dos (o muchas más) funciones a la vez porque esas funciones no están alterando la información de estado externa.
Aquí hay un excelente artículo sobre programación funcional que puede disfrutar.
Los lenguajes funcionales son buenos en muchas situaciones. Depende de las bibliotecas de un lenguaje funcional particular.
¿Cómo respondería a la pregunta "¿Cuándo utilizar un lenguaje de programación orientado a objetos?"
Los lenguajes funcionales son, en mi opinión, buenos para dos cosas principalmente: Game AIs y cálculos matemáticos. Es bueno en los juegos de IA debido a sus buenas manipulaciones de listas (al menos en Lisp y Scheme), y para los cálculos matemáticos debido a su sintaxis. Scheme, Lisp y Haskell tienen una sintaxis que hace que los cálculos matemáticos sean fáciles de leer. Lo último que tengo que agregar es que los lenguajes funcionales son lenguajes realmente divertidos. Mi curso Scheme fue uno de los cursos con los que más me divertí.
Por lo que he visto, es más una cuestión de gusto que de funcionalidad (sin juego de palabras). Realmente, no hay nada en el estilo de lenguaje que lo haga mejorar o empeorar inherentemente en tareas específicas.
Prácticamente todo lo que puede hacer en PP se puede hacer en FP, y lo mismo a la inversa. Es solo otra forma de codificar algo: otra perspectiva sobre el problema y una forma diferente de resolverlo.
Sin embargo, debido a que no muchas personas usan FP, el problema es más acerca de la falta de buenas bibliotecas, portabilidad / mantenibilidad (ya que el mantenedor tiene una mejor oportunidad de entender algo escrito en C ++ que Scheme), y la falta de documentación y comunidad. Sé que HAY algunos documentos, sin embargo, compare eso con C ++, C # o Java y comprenderá lo que quiero decir.
Sin embargo, si realmente quieres hacer FP, puedes usar este estilo incluso en C ++ y C #. Por supuesto, no será un 100% FP si usa la biblioteca estándar. Desafortunadamente, no creo que C # esté optimizado para ser utilizado con programación funcional y probablemente creará muchos problemas de rendimiento.
Esto es más una publicación subjetiva, lo que pienso sobre FP. No es una declaración rigurosa.
Un amigo mío citó a uno de sus profesores universitarios diciendo algo como lo siguiente:
Dibuje una grilla con tipos de datos en la parte superior y las operaciones en esos tipos de datos en el lado izquierdo. Si segmenta la cuadrícula verticalmente, está haciendo OO; si corta la cuadrícula horizontalmente, está haciendo FP.
Mi respuesta es que FP es un enfoque completamente viable para la programación con un rango de aplicación tan amplio como OO. Al igual que con cualquier discusión de selección de lenguaje de programación, creo que las preguntas más importantes son:
- ¿Tienes tiempo para invertir en aprender una nueva notación y una nueva forma de pensar?
- ¿Cuál de los idiomas que está considerando tiene bibliotecas suficientemente ricas para que no se quede estancado reinventando alguna rueda?
En cuanto a la primera pregunta, si estás haciendo esto principalmente por el valor de aprendizaje, te sugiero que busques en Haskell , debido a la amplia gama de materiales de apoyo (libros, artículos, comunidad activa, etc.)
En cuanto a la segunda pregunta, Haskell tiene una buena variedad de bibliotecas (aunque algunas son más maduras que otras), pero Scala (un lenguaje OO-funcional híbrido que se ejecuta en la JVM) tiene las ventajas de que puede pasar más gradualmente al estilo funcional , y tiene a su disposición la gama completa de bibliotecas accesibles para Java.