¿Por qué Python no es muy bueno para la programación funcional? [cerrado]

Resuelto David Johnstone asked hace 15 años • 9 respuestas

Siempre he pensado que la programación funcional se puede realizar en Python. Por lo tanto, me sorprendió que Python no recibiera mucha mención en esta pregunta, y cuando se mencionaba, normalmente no era muy positivo. Sin embargo, no se dieron muchas razones para esto (se mencionaron la falta de coincidencia de patrones y tipos de datos algebraicos). Entonces mi pregunta es: ¿por qué Python no es muy bueno para la programación funcional? ¿Hay más razones además de la falta de coincidencia de patrones y tipos de datos algebraicos? ¿O son estos conceptos tan importantes para la programación funcional que un lenguaje que no los admita solo puede clasificarse como un lenguaje de programación funcional de segunda categoría? (Tenga en cuenta que mi experiencia con la programación funcional es bastante limitada).

David Johnstone avatar Jun 19 '09 19:06 David Johnstone
Aceptado

La pregunta a la que hace referencia es qué lenguajes promueven tanto la programación orientada a objetos como la funcional. Python no promueve la programación funcional aunque funciona bastante bien.

El mejor argumento contra la programación funcional en Python es que Guido considera cuidadosamente los casos de uso imperativos/OO, mientras que los casos de uso de programación funcional no. Cuando escribo Python imperativo, es uno de los lenguajes más bonitos que conozco. Cuando escribo Python funcional, se vuelve tan feo y desagradable como el lenguaje promedio que no tiene BDFL .

Lo cual no quiere decir que sea malo, solo que tienes que trabajar más duro de lo que lo harías si cambiaras a un lenguaje que promueva la programación funcional o si cambiaras a escribir OO Python.

Estas son las cosas funcionales que extraño en Python:

  • La coincidencia de patrones
  • recursividad de cola
  • Gran biblioteca de funciones de lista
  • Clase de diccionario funcional
  • Curry automático
  • Manera concisa de componer funciones.
  • listas perezosas
  • Sintaxis de expresión simple y potente (la sintaxis de bloque simple de Python impide que Guido la agregue)

  • Sin coincidencia de patrones ni recursión de cola significa que sus algoritmos básicos deben escribirse de manera imperativa. La recursividad es fea y lenta en Python.
  • Una biblioteca de listas pequeña y la falta de diccionarios funcionales significan que usted mismo tendrá que escribir muchas cosas.
  • La falta de sintaxis para el curry o la composición significa que el estilo sin puntos está tan lleno de puntuación como los argumentos que se pasan explícitamente.
  • Iteradores en lugar de listas diferidas significa que debe saber si desea eficiencia o persistencia, y distribuir llamadas listsi desea persistencia. (Los iteradores se usan una vez)
  • La sintaxis imperativa simple de Python, junto con su analizador LL1 simple, significa que una mejor sintaxis para expresiones if y lambda es básicamente imposible. A Guido le gusta así y creo que tiene razón.
Nathan Shively-Sanders avatar Jun 19 '2009 13:06 Nathan Shively-Sanders

Guido tiene una buena explicación de esto aquí . Aquí está la parte más relevante:

Nunca he considerado que Python esté fuertemente influenciado por los lenguajes funcionales, sin importar lo que la gente diga o piense. Estaba mucho más familiarizado con lenguajes imperativos como C y Algol 68 y, aunque había creado funciones como objetos de primera clase, no veía a Python como un lenguaje de programación funcional. Sin embargo, antes estaba claro que los usuarios querían hacer mucho más con listas y funciones.

...

También vale la pena señalar que, aunque no imaginé Python como un lenguaje funcional, la introducción de cierres ha sido útil en el desarrollo de muchas otras funciones de programación avanzadas. Por ejemplo, ciertos aspectos de las clases de nuevo estilo, decoradores y otras características modernas dependen de esta capacidad.

Por último, aunque a lo largo de los años se han introducido una serie de características de programación funcional, Python todavía carece de ciertas características que se encuentran en los lenguajes de programación funcionales "reales". Por ejemplo, Python no realiza ciertos tipos de optimizaciones (por ejemplo, recursividad de cola). En general, debido a la naturaleza extremadamente dinámica de Python, es imposible realizar el tipo de optimización en tiempo de compilación conocida en lenguajes funcionales como Haskell o ML. Y eso está bien.

De esto saco dos cosas:

  1. El creador del lenguaje realmente no considera que Python sea un lenguaje funcional. Por lo tanto, es posible ver características "funcionales", pero es poco probable que veas algo que sea definitivamente funcional.
  2. La naturaleza dinámica de Python inhibe algunas de las optimizaciones que se ven en otros lenguajes funcionales. Por supuesto, Lisp es tan dinámico (si no más) que Python, por lo que esto es sólo una explicación parcial.
Jason Baker avatar Jun 19 '2009 12:06 Jason Baker

Scheme no tiene tipos de datos algebraicos ni coincidencia de patrones, pero ciertamente es un lenguaje funcional. Cosas molestas sobre Python desde una perspectiva de programación funcional:

  1. Lambdas lisiadas. Dado que Lambdas solo puede contener una expresión y no se puede hacer todo tan fácilmente en un contexto de expresión, esto significa que las funciones que se pueden definir "sobre la marcha" son limitadas.

  2. Los if son declaraciones, no expresiones. Esto significa, entre otras cosas, que no se puede tener una lambda con un If dentro. (Esto lo solucionan los ternarios en Python 2.5, pero se ve feo).

  3. Guido amenaza con eliminar mapa, filtrar y reducir de vez en cuando

Por otro lado, Python tiene cierres léxicos, Lambdas y listas por comprensión (que en realidad son un concepto "funcional", lo admita Guido o no). Hago mucha programación de "estilo funcional" en Python, pero no diría que sea ideal.

Jacob B avatar Jun 19 '2009 12:06 Jacob B