Voy a ordenar esta guía por el nivel de habilidad que tenga en Haskell, desde un principiante absoluto hasta un experto. Tenga en cuenta que este proceso llevará muchos meses (¿años?), Por lo que es bastante largo.
Principiante absoluto
En primer lugar, Haskell es capaz de cualquier cosa, con suficiente habilidad. Es muy rápido (solo en C y C ++ en mi experiencia), y puede usarse 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 aprendizaje feliz de haskell y los primeros 6 capítulos de aprender un haskell . Mientras lee esto, es una muy buena idea también resolver problemas simples con lo que sabe.
Otros dos buenos recursos son la programación de Haskell desde los primeros principios y la programación en Haskell . Ambos vienen con ejercicios para cada capítulo, por lo que tiene pequeños problemas simples que coinciden con lo que aprendió en las últimas páginas.
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 avanza. Es una buena práctica hacer muchas de ellas, ya que te permiten practicar tus habilidades en funciones de recursión y de orden superior. Recomendaría omitir cualquier problema que requiera aleatoriedad, ya que es un poco más difícil en Haskell. Verifique esta pregunta de 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 resolver algunos de los problemas del Proyecto Euler . Estos se ordenan por la cantidad de personas que los han completado, lo que es un buen indicio de dificultad. Estos prueban su lógica y Haskell más que los problemas anteriores, pero aún así debería poder hacer los primeros. Una gran ventaja que tiene Haskell con estos problemas es que los números enteros no tienen un tamaño limitado. Para completar algunos de estos problemas, será útil haber leído los capítulos 7 y 8 para aprender también sobre Haskell.
Principiante
Después de eso, debe tener un buen manejo de las funciones de recursión y de orden superior, por lo que sería un buen momento para comenzar a resolver algunos problemas del mundo real. Un buen lugar para comenzar es Real World Haskell (libro en línea, también puede comprar una copia impresa). Encontré los primeros capítulos introducidos demasiado rápido para alguien que nunca antes había hecho programación funcional / usado recursividad. Sin embargo, con la práctica que habría tenido al hacer los problemas anteriores, debería encontrarlo perfectamente comprensible.
Trabajar en los problemas del libro es una excelente manera de aprender a manejar 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 tipo, pero son muy diferentes a las clases oo, más bien como interfaces oo ) No creo que sea una buena idea omitir capítulos, ya que cada uno presenta muchas ideas nuevas que se utilizan en capítulos posteriores.
Después de un tiempo llegarás al capítulo 14, el temido capítulo de las mónadas (dum dum dummmm). Casi todos los que aprenden Haskell tienen problemas para comprender 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 las mónadas en la programación funcional. Monads permite que muchas ideas (como operaciones de E / S, cálculos que pueden fallar, análisis, ...) se unifiquen bajo una sola idea. Así que no se desanime si después de leer el capítulo de las mónadas realmente no los comprende. Me pareció útil leer muchas explicaciones diferentes de mónadas; cada uno da una nueva perspectiva sobre el problema. Aquí hay una muy buena lista de tutoriales de mónada . Recomiendo el All About Monads , pero los otros también son buenos.
Además, los conceptos tardan un tiempo en asimilarse realmente. Esto viene a través del uso, pero también a través del tiempo. ¡Encuentro que a veces dormir con un problema ayuda más que cualquier otra cosa! Eventualmente, la idea hará clic y te preguntarás por qué te costó entender un concepto que en realidad es increíblemente simple. Es increíble cuando esto sucede, y cuando sucede, puede encontrar a Haskell como su lenguaje de programación imperativo favorito :)
Para asegurarte de que estás entendiendo perfectamente el sistema de tipo Haskell, debes tratar de resolver 20 ejercicios intermedios de haskell . Esos ejercicios usan nombres divertidos de funciones como "furry" y "banana" y le ayudan a comprender bien algunos conceptos básicos de programación funcional si aún no los tiene. Buena manera de pasar la noche con un montón de papeles cubiertos con flechas, unicornios, salchichas y plátanos peludos.
Intermedio
Una vez que comprenda Mónadas, creo que ha hecho la transición de un programador principiante de Haskell a un intermediario de haskeller. Entonces, ¿a dónde ir desde aquí? Lo primero que recomendaría (si aún no los ha aprendido aprendiendo mónadas) son los diversos tipos de mónadas, como Reader, Writer y State. Una vez más, el mundo real Haskell y All about Mónadas ofrece una gran cobertura de esto. Para completar su entrenamiento de mónada, es imprescindible aprender sobre los transformadores de mónada. Estos le permiten combinar diferentes tipos de mónadas (como un lector y una mónada estatal) en una sola. Para empezar, esto puede parecer inútil, 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. Omitir capítulos ahora realmente no importa, siempre y cuando tenga mónadas. Simplemente elija lo que le interesa.
Con el conocimiento que tendría ahora, debería poder usar la mayoría de los paquetes en cabal (bueno, 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 de Haskell del mundo real.
QuickCheck : un programa de prueba muy bueno. Lo que haces 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 prueba que el predicado es verdadero para todos los resultados. Ver también el manual en línea .
HUnit : Unidad de pruebas en Haskell.
gtk2hs : el marco gui más popular para Haskell, le permite escribir aplicaciones gtk en Haskell.
happstack : un marco de desarrollo web para Haskell. No utiliza bases de datos, en su lugar, un almacén de tipos de datos. Documentos bastante buenos (otros marcos populares serían snap y yesod ).
Además, hay muchos conceptos (como el concepto Monad) que eventualmente debería aprender. Esto será más fácil que aprender Mónadas la primera vez, ya que tu cerebro estará acostumbrado a lidiar con el nivel de abstracción involucrado. Una muy buena visión general para aprender sobre estos conceptos de alto nivel y cómo encajan entre sí es Typeclassopedia .
Aplicativo: una interfaz como Monads, pero menos potente. Cada mónada es aplicativa, pero no al revés. Esto es útil ya que hay algunos tipos que son Aplicativos pero que no son Mónadas. Además, el código escrito usando las funciones Aplicativas es a menudo más componible que escribir el código equivalente usando las funciones Monad. Vea Functores, Funcionadores aplicativos y Monoides de la guía Aprenda un haskell.
Plegable , de Traversable : clases de tipos que muchos abstracta de las operaciones de listas, de modo que las mismas funciones se pueden aplicar a otros tipos de contenedores. Vea también la explicación de la wiki de Haskell .
Monoide : un monoide es un tipo que tiene un valor cero (o mempty), y una operación, anotada <>
que une dos monoides, tal 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 antiguas de Haskell.
Matrices : las diversas matrices mutables / inmutables en Haskell.
ST Monad : le permite escribir código con un estado mutable que se ejecuta muy rápidamente, sin dejar de ser puro fuera de la mónada. Vea el vínculo para mas detalles.
FRP: Programación funcional reactiva, una nueva forma experimental de escribir código que maneja eventos, disparadores, entradas y salidas (como una interfaz gráfica de usuario). Sin embargo, no sé mucho sobre esto. La charla de Paul Hudak sobre yampa es un buen comienzo.
Hay muchas características nuevas del lenguaje que deberías echar un vistazo. Solo los enumeraré, puedes encontrar mucha información sobre ellos en google, el haskell wikibook , el sitio haskellwiki.org y la documentación de ghc .
- Clases de tipo multiparamétrico / dependencias funcionales
- Escriba familias
- Tipos cuantificados existencialmente
- Tipos fantasma
- GADTS
- otros...
Gran parte de Haskell se basa en la teoría de categorías , por lo que es posible que desee analizar eso. Un buen punto de partida es la teoría de categorías para informáticos . Si no desea 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. Éstas 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 Haskell.
- eglefino : un generador de documentación automática 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 pequeño juego, analizador de datos, sitio web, compilador ). Trabajar en esto le permitirá aplicar muchas de las cosas que ahora está aprendiendo. Te quedas en este nivel durante siglos (aquí es donde estoy).
Experto
Le llevará años llegar a esta etapa (¡hola desde 2009!), Pero desde aquí supongo que comenzará a escribir documentos de doctorado, nuevas extensiones de ghc y generar nuevas abstracciones.
Obteniendo ayuda
Finalmente, 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 inscribirse solo para leer las discusiones que tienen lugar, algunas son muy interesantes.
- otros lugares listados en la página de inicio de haskell.org
Conclusión
Bueno, esto resultó más de lo que esperaba ... De todos modos, creo que es una muy buena idea dominar Haskell. Lleva mucho tiempo, pero eso se debe principalmente a que estás aprendiendo una forma de pensar completamente nueva al hacerlo. 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 de aprender Haskell, ya que estoy viendo muchas formas nuevas de abstraer ideas.