2010-07-04 16 views
31

Duplicar posible:
Haskell vs. procedural programming in the real world¿Por qué debería querer aprender Haskell?

Pocas veces he escuchado a la gente decir cosas como "Todo programador debe saber Haskell", "Usted no es un programador, si usted no sabe Haskell " y así. Sin embargo, no estoy exactamente seguro de si debería molestarme en tratar de obtener un breve entendimiento de ese idioma o no. Jugar con un intérprete (para obtener una comprensión intuitiva de los conceptos básicos) llevará al menos unos días (si no semanas), y no estoy exactamente seguro de si el resultado valdrá la pena.

Un poco de fondo (para obtener idea de mi conocimiento)
he comenzado la programación como un niño (hace en alguna parte entre 10 y 13 años) con la calculadora programable, se trasladó a los servicios básicos, a continuación, en conjunto no x86 (reimlementing multiplicación y división, y la escritura del ratón auto-modificable conductor era divertido), Pascal, Delphi, ahora estoy usando C++ casi exclusivamente. Conocer mi camino alrededor de UNIX, puede escribir software en Python y probablemente en cualquier cosa (si tengo un libro de referencia cercano) que se asemeja remotamente C++ o Pascal (es decir, bloques, control de flujo similar, etc.). La especialización es la programación en 3D y sombreadores. "Peces en el agua" con operaciones de bajo nivel (Cs asignación de memoria tyle, punteros), menos cómodo con el enfoque extremadamente OOP (es decir cuando las clases se hacen por el solo hecho de tener clases). Casi completamente autodidacta. Es decir. Definitivamente no es un novato, pero hay áreas donde podría mejorar.

Así que ... ¿Qué podría ganar con el estudio de Haskell en este punto? Hasta donde yo sé, este lenguaje no es muy utilizado, por lo que es probable que haya menos bibliotecas con las que interactuar (como con la programación Delphi, puedes hacer programación de DirectX en Delphi, si realmente quieres, pero puedes No escriba 3dsmax/maya plugin con él (bueno, probablemente sea teóricamente posible, pero ciertamente no será fácil)). Tampoco creo que pueda enchufar fácilmente una parte del código Haskell en el motor del juego.

Entonces, ¿qué tipo de conocimiento útil que puedo obtener de ella?

P.S. No compraré el argumento "si aprendes otro idioma, probablemente aprenderás algo que probablemente será útil".

+0

¿Existe un duplicado? http://stackoverflow.com/questions/1604790/what-is-haskell-actually-useful-for –

+2

@Sergio Tapio: No lo creo. Su pregunta es "¿dónde podré usar Haskell?", Le pregunté "qué tipo de conocimiento útil obtendré de él". No me importa si el lenguaje es popular o no, pero si enseña algún tipo de concepto que pueda (posiblemente) volver a aplicar en otro idioma, puede valer la pena mi tiempo. – SigTerm

+3

Otro dup: http://stackoverflow.com/questions/1024585/haskell-vs-procedural-programming-in-the-real-world – Konerak

Respuesta

72

(Seguramente esto es una pregunta duplicado, pero no puedo encontrar uno ahora.)

Se aprende con el fin de aprender la programación funcional pura, lo que le obliga a hacer muchas cosas de una manera completamente diferente. Obtienes una nueva forma de pensar. Programación sin estado? Programación sin efectos? Todo es flojo? Sistema de tipo loco con tipo de inferencia? ¿Qué demonios son las mónadas? Tu mente será soplada repetidas veces, pero al final saldrás con nuevas perspectivas/técnicas de programación funcional que son difíciles de detectar si no tienes Haskell en toda regla.

El problema con tratar de ser específico, es que tratar de decirle a un no Haskeller lo que aprenderán de Haskell es como tratar de explicar el color "verde" a un ciego.

+14

Por cierto, reaccionando al "sistema de tipo loco": creo que el sistema de tipos de Haskell es lo más natural que se puede imaginar, y me pregunto por qué otros idiomas no lo hicieron tener tales sistemas de tipo sensible. :-) – ShreevatsaR

+0

@Shreevatsa, si su "pregunta" no es retórica, entonces: "otros" lenguajes no tienen este tipo de sistemas porque están orientados a las operaciones llevadas a cabo durante la ejecución (incluso OO langs), no a la belleza de notación o a las relaciones entre los conceptos que constituyen el programa. –

+10

@Carl Smotricz: * "Es como el sistema de tipos de Haskell con Java conectado como un lenguaje de scripting." * ... eso es posiblemente lo más aterrador que he escuchado. :) –

2

El aprendizaje de un lenguaje funcional habrá un gran cambio de lo que estamos acostumbrados. Así que sí, es probable que va a aprender algo útil;)

+1

Desafortunadamente, este es exactamente el tipo de respuesta que OP no quiere :) –

15

Yo tampoco creo que voy a ser fácilmente capaz de conectar una pieza de código Haskell en el motor de juego.

Si solo quieres escribir motores de juegos en 3D, quizás no tenga mucho sentido aprender Haskell.

Si quieres ser un programador completo capaz de programar en múltiples paradigmas y actualmente solo conoces los lenguajes tipo C, vale la pena echarle un vistazo.

Cada vez que aprendes un nuevo idioma muy diferente, hace que aprender el siguiente idioma sea más fácil porque no solo estás memorizando nueva sintaxis, sino que también estás aprendiendo diferentes formas de pensar acerca de la programación. Si prueba un nuevo idioma y ve alguna característica nueva, lo entenderá más rápidamente si puede relacionarlo con otra función en un idioma que ya conoce. Cuantos más idiomas conozca, es más probable que esta nueva característica sea similar a algo que haya visto anteriormente.

También es útil tener muchas herramientas disponibles en su caja de herramientas. Algunos problemas se resuelven mejor en un idioma que en otro. Si tiene 5 tipos de idiomas muy diferentes, puede seleccionar el mejor para cada problema. Si solo conoces 2 o 3 idiomas muy similares, algunos problemas serán fáciles de resolver, pero otros pueden ser más difíciles que si usaras un idioma que sea mejor para esa tarea específica.

1

Los lenguajes funcionales como Haskell son una manera diferente de pensar sobre un problema. Son útiles para aprender y enseñar estructuras de datos y algoritmos, ya que simplifican ese tipo de problemas.

Si usa el STL de C++, que tiene conceptos funcionales que son similares a Haskell y a otros idiomas, tener una base en Haskell ayudará a entender cómo funciona el STL.

Si usa XSL: T para transformar XML, es muy funcional en su diseño.

+1

Supongo que confundiste "funcional" con "declarativo".XSLT no tiene funciones de primer orden, ¿o sí? –

4

Hay varias cosas que puede obtener, principalmente en la manera de pensar sobre las cosas. Por ejemplo, es interesante notar qué es un lenguaje mínimo. Si pasa por SICP (y los mismos conceptos también se aplican a Haskell), notará que no necesita sintaxis de bucle. No necesita funciones predefinidas que funcionen en estructuras más grandes. Puede definir casi todo lo que necesita si le dan un contra constructor/deconstructor, o una forma de definir uno, y la capacidad de recurrir funciones. Puede definir todo lo demás usted mismo, y es un ejercicio interesante para hacerlo. Y esto es solo la punta del iceberg.

En un nivel más práctico, por ejemplo, hace un par de semanas estaba haciendo la tarea de OCaml y gimiendo "¿por qué este lenguaje $% $% # tiene call/cc??!" Me quedé boquiabierta cuando me di cuenta de lo que estaba pensando: nunca me lo habría perdido si no supiera qué era, y no sabría de qué se trataba si no echaba un vistazo a Scheme, Haskell, Rubí.

Puede encontrar muchos buenos ejemplos en el concurso de ICFP; el que realmente me cautivó fue this entry al this contest. Crearon un nuevo lenguaje dentro de Haskell para resolver su problema.

+0

+1 para la función de idioma que desea pero que no puede tener. La ignorancia es una bendición, así que aprende un solo lenguaje de programación y olvida todos los demás. ¡Te mancharán la mente con ideas de pecado pero no podrán usar! –

40

Hace unos años, una chica guapa en nuestro departamento decidió estudiar Informática a tiempo parcial. ¡Muchas personas se sorprendieron al descubrir que uno de los cursos introductorios se estaba enseñando usando Haskell como el/el lenguaje de programación! Aunque no tenía experiencia con Haskell, tenía algunos antecedentes en Lisp y otros lenguajes de programación funcional y pude ayudarla con sus ejercicios.

No, no hay un final feliz para esta historia: ella se retiró, se casó con otra persona y no la he visto en mucho tiempo. Pero creo que la anécdota muestra cómo el conocimiento puede ser útil cuando menos lo esperas.


En términos más prácticos: Usted puede haber notado que las velocidades de CPU chocó contra un muro hace unos años, y ahora la forma más práctica para sacar más rendimiento de las computadoras es mediante la instalación de varias CPU. Ahora sucede que la mayoría, si no todos, los lenguajes de programación que usted conoce son esencialmente de tarea única, y están sujetos al Von Neumann bottleneck. Una solución obvia es la programación en paralelo, pero eso puede ser muy doloroso si las partes paralelas de su programa terminan compartiendo el estado, es decir, la memoria, y este es el caso más frecuente.

Resulta que la Programación Funcional es un estilo que le permite sortear en su mayoría los problemas de programación en paralelo con estado compartido. Dicho de otra manera, es bastante fácil escribir programas en el estilo FP que sean "naturalmente" seguros para subprocesos y adecuados para el procesamiento en paralelo. Dependiendo del idioma, el compilador y el hardware, es posible que encuentre (como hice recientemente) partes de su programa que se ejecutan en paralelo sin haber hecho ninguna codificación explícita para el paralelismo.

Frecuentemente estoy equivocado, pero creo que la Programación Funcional se convertirá en uno de los paradigmas de programación más candentes del futuro a medida que la programación paralela se vuelve más importante y más difícil. Puede que Haskell no sea el idioma de elección, mi favorito personal es actualmente Clojure, pero bien valdría la pena echarle un vistazo a uno o más lenguajes de FP.

2

Yo diría, si es una tarea no lo hagas. De lo contrario, comience a leer this y verá después de 10 minutos si está aburrido o si está agarrado y no puede dejar de leerlo.

Cuestiones relacionadas