2009-12-22 14 views
5

Aprendió Haskell durante un curso de Programación Funcional en la escuela. Has encontrado a Haskell un poco difícil de trabajar. Ahora he trabajado mucho en Python. Python es bastante fácil de usar.¿Cuál es un lenguaje de programación más funcional, Haskell o Python?

Python es compatible con algunas construcciones de programación funcional.

Estaba pensando en volver a la programación funcional. ¿Cuál sería un mejor lenguaje para codificar? Haskell o Python? ¿Por qué?

+3

no hay mejor lenguaje (funcional), solo diferentes idiomas. De todos modos, python no es un lenguaje funcional. – Chii

+0

Oh, vamos. -1 para esta pregunta no es justo. Si nunca ha realizado un proyecto en Erlang, XSLT o Haskell, puede confundir estas funciones con demasiada facilidad. – Boldewyn

+9

Esto podría ser subjetivo si Python fuera en realidad un lenguaje funcional. De hecho, Python adopta el estilo imperativo y el estado mutable, y elige algunas construcciones funcionalistas donde le conviene. –

Respuesta

32

Encontrará muchas críticas en otros lugares sobre cómo los programadores de Python no deberían usar funciones funcionales como lambda. Alex Martelli es particularmente bueno en esto. Pero si se aproxima a la programación funcional como programador de Python, no tendrá mucha idea de por qué a las personas interesadas en la programación funcional les interesa en primer lugar la. En particular, no tendrá acceso a un poderoso sistema de tipo estático y tipos de datos algebraicos. Estas herramientas son definitivamente parte de la mentalidad de Haskell.

La programación funcional no es tanto un conjunto de características como una forma de pensar. Para ver esa forma de pensar en acción y comenzar a aprenderla, consulte el documento Why Functional Programming Matters de John Hughes. Lo que aprendes de Hughes puedes aplicar fácilmente en Haskell. De hecho, Haskell es mucho más probable que fuerza que aprender esa nueva forma de pensar. Con Python puedes usar algunas lambdas aquí y allá y engañarte de que estás aprendiendo programación funcional. No lo serás

Dicho esto, Haskell puede ser mucho para tragar todo a la vez. Si le resulta difícil, puede probar Standard ML o Racket (anteriormente llamado PLT Scheme o DrScheme). Standard ML le presentará nuevas ideas, pero esas personas no actúan juntas para dar la bienvenida a los recién llegados de la forma en que lo hacen los Racketeers o los Haskell.

+0

¿De verdad crees que un poderoso sistema de tipo es el atractivo para la programación funcional? Mirando el índice TIOBE, Lisp y Erlang parecen ser los lenguajes funcionales más populares, y ambos son dinámicos AFAIK. – Chuck

+6

Creo que un poderoso sistema de tipos es * un * gran atractivo. Un potente macro sistema también es un gran atractivo, que creo que explica parte de la popularidad de LISP. Erlang es popular no tanto por sus características funcionales sino por su fiabilidad y paralelismo escalable. Además, no hace daño tener un importante fabricante de hardware detrás de ti. Ericsson es para telefonía y Erlang como Sun para informática y Java. Quizás más aún. –

+1

La simplicidad de QuickCheck en Haskell (frente a Erlang) viene directamente de su aprovechamiento del sistema de tipos de Haskell. Entonces, sí, el sistema de tipos de Haskell es desalentador para algunos (creo que las clases de tipos son sucias y conducen a una dificultad innecesaria para escribir programas), pero es poderoso y proporciona una base para gran parte de lo que Haskell logra. –

38

Haskell es un lenguaje de programación funcional, mientras que Python solo tiene algunas características de lenguajes de programación funcionales. Entonces, esto está arreglado. Q.e.d.

Editar: Lo que falta en Python, sólo para dar una ejemplo, es el optimization of recursive function calls. Esto es vital en la mayoría de los real lenguajes de programación funcional.

Google, por cierto, acaba de producir this nice article.

-4

Desde el Haskell homepage:

Haskell es un lenguaje de programación puramente funcional avanzada. Un producto de código abierto de más de veinte años de investigación de vanguardia, permite un rápido desarrollo de software robusto, conciso y correcto.

traducción sarcástico:

  • "avanzada" = "No es para todo el mundo"
  • "puramente funcional" = "Definitivamente no para todo el mundo"
  • "más de veinte años" = "¡Y todavía no a todos les gusta!"
  • "cutting edge research" = "¡Existe la posibilidad de que encuentre un problema práctico que pueda resolver con él, pero aún estamos trabajando en ello!"
  • "software correcto, conciso y correcto" = "¿Te estás perdiendo algo simple, comprensible, obvio, legible? Adivina por qué!"

Bromas aparte, los lenguajes funcionales no son para la mayoría y nunca lo serán. Hay personas que pueden pensar como una pila pero, por mi parte, prefiero que la computadora intente comprender mi galimatías.

+2

+1 para entender galimatías: la computadora debería ser más como YO. – whatnick

+6

¿Qué tiene que ver una pila con los lenguajes funcionales? Adelante es el idioma si te gustan las pilas. Si es la base de su opinión sobre los lenguajes funcionales, me temo que tiene un largo, ** largo ** camino por recorrer antes de asimilarlos. Sarcástico también – rvirding

+9

¿Qué? ¿Su afirmación es que la programación funcional está demasiado cerca del metal? En un mundo donde C es el idioma dominante, ¿no? Tienes que estar fuera de tus medicamentos. Haskell es muy alto nivel. Lo que realmente quieres decir aquí es "No es lo que ya sé". – Chuck

0

Lo que dijo Boldewyn. Haskell es uno de los lenguajes funcionales más "hardcore" que hay , en la medida en que simplemente no hay forma de mantener el estado mutable.

Dicho esto, Haskell es (como era de esperar) tremendamente diferente de todos los idiomas imperativos y de modelos mixtos con los que la mayoría de la gente entra en contacto, por lo que habría una curva de aprendizaje en recogerlo si uno proviene de un entorno de, decir, VB o C (++) o Java.

Python, por otro lado, cuenta con una sección "Mostrar y contar funcional" donde se pueden probar un puñado de características funcionales dentro de un entorno predominantemente imperativo.

Por lo tanto, si en su pregunta original, el OP "mejor" significaba "más funcional" o "un ciudadano mejor de la tierra funcional" (como lo ha aclarado), entonces Haskell "gana" indiscutiblemente.

+1

Haskell ciertamente proporciona un estado mutable, simplemente no es el predeterminado. Considere las referencias mutables (IORef/STRef) y las matrices mutables (IOArray/STArray) en las bibliotecas base. El hecho de que no sea el predeterminado no significa que no exista. –

+7

Por supuesto, las características funcionales de conducción de prueba en Python son un poco como probar un automóvil encendiéndolo y dejándolo en el parque. El propio Guido es bastante crítico con la programación funcional en Python. Para empezar, las lambdas son definitivamente ciudadanos de segunda clase para funciones reales. – Chuck

7

Si bien Python sí admite algunas construcciones funcionales, Haskell es un lenguaje funcional. Lo que también debe tener en cuenta es que Haskell también es puramente funcional y , dos conceptos que pueden ser la causa de la dificultad que encuentra en Haskell. Si este es el caso, sigue leyendo.

Lo que puede considerar, si, por supuesto, tiene el tiempo, es aprender otro idioma menos complejo y funcional. Descubrí que aprender un lenguaje menos "agresivamente funcional" antes de pasar a Haskell es un paso que vale la pena. Es posible que desee considerar OCaml (Objective Caml), otro lenguaje de programación funcional, que no es puro ni vago. Por lo tanto, algunas construcciones de programación imprescindibles estarán disponibles para usted (referencias, bucles, matrices mutables, etc.), y no tendrá que lidiar con las mónadas hasta que realmente lo desee.

Esto depende por completo del tiempo que esté dispuesto a pasar visitando la programación funcional, y de su experiencia actual en este mismo paradigma.

+3

Nuevamente, * Haskell proporciona matrices mutables, referencias y bucles *. Simplemente no son los predeterminados: IORef/IOArray/Control.Monad.for etc. –

+0

De acuerdo, pero son una parte bastante oscura del lenguaje que generalmente se desaconseja, o incluso no se menciona, a los usuarios nuevos. – CharlieP

+3

@dons: No se trata de lo que el lenguaje hace posible (ten cuidado con el tarpit de Turing), se trata de lo que el lenguaje facilita. – Chuck

11

Esta pregunta resalta uno de mis motivos favoritos acerca de la comprensión común de la programación funcional. Tener funciones de idioma como cierres y funciones de primera clase no hace que un lenguaje sea un lenguaje de programación funcional. La programación funcional se trata tanto de un estilo específico de programación como de construcciones de lenguaje específicas. Python tiene cierres, funciones de primera clase y sí, incluso una función llamada "mapa", pero el lenguaje en sí fomenta un procedimiento, OOP, imperativo estilo de programación; por lo tanto, incluso si utiliza las funciones funcionales, todavía está programando de manera imperativa.

Como un lenguaje puramente funcional , Haskell básicamente mandatos que un programa en un estilo funcional declarativa, por lo que las manos hacia abajo, Haskell es "más funcional" que Python.

+2

La función de primera clase requiere lambdas anónimos adecuados y llamadas de cola razonables desde el punto de vista del espacio, ninguna de las cuales tiene Python. De lo contrario, estoy de acuerdo de todo corazón. Cf. http://lambda-the-ultimate.org/node/3532#comment-50319 –

Cuestiones relacionadas