Voy a ordenar esta guía por el nivel de habilidad que tiene en haskell, yendo desde un principiante absoluto hasta un experto. Tenga en cuenta que este proceso llevará muchos meses (¿años?), Por lo que es bastante largo.
Aprenda sobre Haskell aquí: https://hackr.io/tutorials/learn …
Principiante absoluto
En primer lugar, haskell es capaz de cualquier cosa, con suficiente habilidad. Es muy rápido (detrás de c y c ++, según mi experiencia), y se puede usar para cualquier cosa, desde simulaciones hasta servidores, guis y aplicaciones web.
Sin embargo, hay algunos problemas que son más fáciles de escribir para un principiante en haskell que otros. Los problemas matemáticos y los programas de proceso de listas son buenos candidatos para esto, ya que solo requieren el conocimiento más básico de haskell para poder escribir.
En primer lugar, algunas buenas guías para aprender los conceptos básicos de haskell son el tutorial de aprender feliz de haskell y los primeros 6 capítulos de aprender un haskell. Mientras lees esto, es una muy buena idea también resolver problemas simples con lo que sabes.
Una buena lista de problemas para probar es la página de problemas de haskell 99. Estos comienzan muy básicos y se vuelven más difíciles a medida que avanzas. Es una muy buena práctica hacer muchas de ellas, ya que te permiten practicar tus habilidades en recursión y funciones de orden superior. Recomendaría omitir cualquier problema que requiera aleatoriedad ya que es un poco más difícil en haskell. Marque esta pregunta SO en caso de que quiera probar sus soluciones con QuickCheck (consulte Intermedio a continuación).
Una vez que haya hecho algunos de esos, podría pasar a hacer algunos de los problemas del Proyecto Euler. Estos están ordenados por la cantidad de personas que los han completado, lo que es una buena indicación de dificultad. Estos ponen a prueba tu lógica y haskell más que los problemas anteriores, pero aún así deberías poder hacer los primeros. Una gran ventaja de haskell con estos problemas es que los enteros no están limitados en tamaño. Para completar algunos de estos problemas, será útil haber leído los capítulos 7 y 8 para aprender también un haskell.
Principiante
Después de eso, deberías tener un buen manejo de la recursión y las funciones de orden superior, por lo que sería un buen momento para comenzar a hacer más problemas del mundo real. Un muy buen lugar para comenzar es Real World Haskell (libro en línea, también puede comprar una copia impresa). Encontré que los primeros capítulos se introdujeron demasiado rápido para alguien que nunca antes había hecho la programación funcional / uso recursivo. Sin embargo, con la práctica que habría tenido de hacer los problemas anteriores, debería encontrarlo perfectamente comprensible.
Resolver los problemas del libro es una excelente manera de aprender a administrar abstracciones y construir componentes reutilizables en haskell. Esto es vital para las personas acostumbradas a la programación orientada a objetos (oo), ya que los métodos normales de abstracción oo (clases oo) no aparecen en haskell (haskell tiene clases de tipos, pero son muy diferentes de las clases oo, más bien son interfaces oo ). No creo que sea una buena idea saltear capítulos, ya que cada uno presenta muchas ideas nuevas que se usan en capítulos posteriores.
Después de un tiempo, llegará al capítulo 14, el temido capítulo de las mónadas (dum dum dummmm). Casi todos los que aprenden haskell tienen problemas para entender las mónadas, debido a lo abstracto que es el concepto. No puedo pensar en ningún concepto en otro lenguaje que sea tan abstracto como lo son las mónadas en la programación funcional. Las mónadas permiten que muchas ideas (como operaciones de E / S, cálculos que pueden fallar, análisis, …) se unifiquen bajo una sola idea. Así que no te desanimes si después de leer el capítulo de las mónadas realmente no las entiendes. Me pareció útil leer muchas explicaciones diferentes de las mónadas; Cada uno da una nueva perspectiva sobre el problema. Aquí hay una muy buena lista de tutoriales de mónada. Recomiendo encarecidamente el All About Monads, pero los demás también son buenos.
Además, toma un tiempo para que los conceptos realmente se hundan. Esto viene a través del uso, pero también a través del tiempo. ¡Encuentro que a veces dormir sobre un problema ayuda más que cualquier otra cosa! Eventualmente, la idea hará clic y te preguntarás por qué luchaste por entender un concepto que en realidad es increíblemente simple. Es asombroso cuando esto sucede, y cuando sucede, puede que encuentre que haskell sea su lenguaje de programación imperativo favorito
Para asegurarse de que comprende perfectamente el sistema de tipos Haskell, debe intentar resolver 20 ejercicios de haskell intermedios. Esos ejercicios utilizan nombres divertidos de funciones como “furry” y “banana” y te ayudan a comprender mejor algunos conceptos básicos de programación funcional si aún no los tienes. Una buena forma de pasar la noche con una lista de papeles cubiertos con flechas, unicornios, salchichas y plátanos peludos.
Intermedio
Una vez que entiendas a Monads, creo que has hecho la transición de un programador de haskell principiante a un haskeller intermedio. Entonces, ¿a dónde ir desde aquí? Lo primero que recomendaría (si aún no los ha aprendido de las mónadas de aprendizaje) son los distintos tipos de mónadas, como Reader, Writer y State. De nuevo, Real world haskell y All about monads ofrecen una gran cobertura de esto. Para completar tu entrenamiento de mónadas, aprender sobre los transformadores de mónadas es imprescindible. Éstos le permiten combinar diferentes tipos de mónadas (como un lector y una mónada estatal) en uno. Esto puede parecer inútil para empezar, pero después de usarlos por un tiempo, se preguntará cómo vivió sin ellos.
Ahora puedes terminar el libro de haskell del mundo real si quieres. Sin embargo, omitir capítulos ahora realmente no importa, siempre y cuando tengas mónadas. Simplemente elige lo que te interesa.
Con el conocimiento que tendría ahora, debería poder utilizar la mayoría de los paquetes en cabal (al menos los documentados …), así como la mayoría de las bibliotecas que vienen con haskell. Una lista de bibliotecas interesantes para probar sería:
- Parsec: para analizar programas y texto. Mucho mejor que usar expresiones regulares. Excelente documentación, también tiene un capítulo real de haskell.
- Quickcheck: Un programa de prueba muy bueno. Lo que hace es escribir un predicado que siempre debe ser verdadero (por ejemplo,
length (reverse lst) == length lst
). Luego pasa el predicado quickCheck, y generará muchos valores aleatorios (en este caso, listas) y comprobará que el predicado sea verdadero para todos los resultados. Véase también el manual en línea.
- HUnit: Pruebas unitarias en haskell.
- gtk2hs: el marco gui más popular para haskell, te permite escribir aplicaciones gtk en haskell.
- happstack: Un framework de desarrollo web para haskell. No utiliza bases de datos, en lugar de un almacén de tipos de datos. Documentos bastante buenos (otro marco popular sería snap y yesod).
Además, hay muchos conceptos (como el concepto de la mónada) que eventualmente deberías aprender. Esto será más fácil que aprender Mónadas la primera vez, ya que su cerebro estará acostumbrado a tratar con el nivel de abstracción involucrado. Una descripción muy buena para aprender sobre estos conceptos de alto nivel y cómo encajan entre ellos es la Typeclassopedia.
- Aplicativo: Una interfaz como las mónadas, pero menos potente. Cada mónada es aplicativa, pero no viceversa. Esto es útil ya que hay algunos tipos que son Aplicativos pero no son Mónadas. Además, el código escrito con las funciones de aplicación es a menudo más composible que escribir el código equivalente con las funciones de la mónada. Ver Functors, Applicative Functors y Monoids en la guía de haskell de Learn You.
- Foldable, Traversable: Clases de tipos que abstraen muchas de las operaciones de las listas, de modo que las mismas funciones se pueden aplicar a otros tipos de contenedores. Véase también la explicación de haskell wiki.
- Monoide: un Monoide es un tipo que tiene un valor de cero (o mempty), y una operación anotada
<>
que une dos Monoides juntos, de manera que x <> mempty = mempty <> x = x
y x <> (y <> z) = (x <> y) <> z
. Estas se llaman leyes de identidad y asociatividad. Muchos tipos son monoides, como los números, con mempty = 0
y <> = +
. Esto es útil en muchas situaciones.
- Flechas: Las flechas son una forma de representar cálculos que toman una entrada y devuelven una salida. Una función es el tipo más básico de flecha, pero hay muchos otros tipos. La biblioteca también tiene muchas funciones muy útiles para manipular flechas, son muy útiles incluso si solo se usan con funciones haskell antiguas.
- Arreglos: los varios arreglos mutables / inmutables en haskell.
- ST Monad: le permite escribir código con un estado mutable que se ejecuta muy rápidamente, mientras permanece puro fuera de la mónada. Vea el vínculo para mas detalles.
- FRP: Functional Reative Programming, una nueva forma experimental de escribir código que maneja eventos, activadores, entradas y salidas (como una interfaz gráfica de usuario). Aunque no sé mucho sobre esto. La charla de Paul Hudak sobre la yampa es un buen comienzo.
Hay un montón de nuevas características de lenguaje que deberías echar un vistazo. Solo los enumeraré, puede encontrar mucha información sobre ellos en google, el haskell wikibook, el sitio http://haskellwiki.org y la documentación de ghc.
- Clases de tipo multiparamétrico / dependencias funcionales.
- Tipo familias
- Tipos cuantificados existencialmente
- Tipos fantasma
- GADTS
- otros…
Una gran cantidad de haskell se basa en la teoría de categorías, por lo que es posible que desee analizarla. Un buen punto de partida es la teoría de categorías para informáticos. Si no quiere comprar el libro, el artículo relacionado con el autor también es excelente.
Finalmente, querrá aprender más sobre las diversas herramientas de haskell. Éstos incluyen:
- ghc (y todas sus características)
- cabal: el sistema de paquetes haskell
- darcs: un sistema de control de versiones distribuido escrito en haskell, muy popular para los programas de haskell.
- eglefino: un generador automático de documentación de haskell
Mientras aprende todas estas nuevas bibliotecas y conceptos, es muy útil escribir un proyecto de tamaño moderado en haskell. Puede ser cualquier cosa (por ejemplo, un juego pequeño, un analizador de datos, un sitio web, un compilador). Trabajar en esto le permitirá aplicar muchas de las cosas que ahora está aprendiendo. Te quedas en este nivel por edades (aquí es donde estoy).
Experto
Te llevará años llegar a esta etapa (¡hola desde 2009!), Pero a partir de aquí supongo que empiezas a escribir documentos de doctorado, nuevas extensiones de ghc y nuevas abstracciones.
Obteniendo ayuda
Finalmente, mientras se encuentra en cualquier etapa de aprendizaje, existen múltiples lugares para obtener información. Estos son:
- el canal # haskell irc
- Las listas de correo. Vale la pena registrarse solo para leer las discusiones que tienen lugar, algunas son muy interesantes.
- otros lugares que figuran en la página de inicio de Haskell Language
Conclusión
Bueno, esto resultó más largo de lo que esperaba … De todos modos, creo que es una muy buena idea dominar el haskell. Lleva mucho tiempo, pero eso se debe principalmente a que, al hacerlo, está aprendiendo una forma de pensar completamente nueva. No es como aprender ruby después de aprender java, sino como aprender java después de aprender c. Además, estoy descubriendo que mis habilidades de programación orientada a objetos han mejorado como resultado del aprendizaje de haskell, ya que estoy viendo muchas formas nuevas de abstraer ideas.
Fuente- Comenzando con Haskell