Pregunta Comenzando con Haskell


Durante unos días intenté comprender el paradigma de la programación funcional en Haskell. Lo he hecho leyendo tutoriales y viendo screencasts, pero nada parece seguir. Ahora, al aprender varios lenguajes imperativos / OO (como C, Java, PHP), los ejercicios han sido una buena forma de ir. Pero como realmente no sé de lo que es capaz Haskell y porque hay muchos conceptos nuevos que utilizar, no sé por dónde empezar.

Entonces, ¿cómo aprendiste a Haskell? ¿Qué te hizo realmente "romper el hielo"? Además, ¿alguna buena idea para comenzar ejercicios?


758


origen


Respuestas:


Voy a ordenar esta guía por el nivel de habilidad que tienes en Haskell, yendo de un principiante absoluto hasta un experto. Tenga en cuenta que este proceso tomará muchos meses (¿años?), Por lo que es bastante largo.

Novato absoluto

En primer lugar, haskell es capaz de todo, con suficiente habilidad. Es muy rápido (solo detrás de c y c ++ en 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 las happy learn haskell tutorial y los primeros 6 capítulos de aprenderte un haskell. Mientras lee esto, es una muy buena idea también resolver problemas simples con lo que sabe.

Otros dos buenos recursos son Haskell Programación desde los primeros principiosy Programación en Haskell. Ambos vienen con ejercicios para cada capítulo, por lo que tienes pequeños problemas simples que coinciden con lo que aprendiste 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 avanzas. Es una 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. Comprobar esta pregunta SO en caso de que quiera probar sus soluciones con QuickCheck (consulte Intermedio abajo).

Una vez que hayas hecho algunos de ellos, puedes pasar a hacer algunos de los Proyecto Euler problemas. Estos se ordenan según la cantidad de gente que los completó, lo cual es una indicación bastante buena de la dificultad. Estos prueban tu lógica y haskell más que los problemas previos, pero aún deberías poder hacer los primeros. Una gran ventaja que tiene Haskell con estos problemas es que los números 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 un haskell también.

Principiante

Después de eso deberías tener un buen manejo de las funciones de recursión y de orden superior, por lo que sería un buen momento para empezar a hacer algunos problemas más del mundo real. Un muy buen lugar para comenzar es Real World Haskell (libro en línea, también puede comprar una copia impresa). Descubrí que los primeros capítulos se presentaron demasiado rápido para alguien que nunca antes había hecho una programación funcional / utilizó la recursión. Sin embargo, con la práctica que habría tenido al hacer los problemas anteriores, debería encontrarla perfectamente comprensible.

Trabajar a través de los problemas en el 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 de abstracción normales (oo classes) no aparecen en haskell (haskell tiene clases de tipo, pero son muy diferentes a las clases, más como las interfaces oo ) No creo que sea una buena idea omitir capítulos, ya que cada uno presenta muchas ideas nuevas que se usan en capítulos posteriores.

Después de un tiempo llegarás al capítulo 14, el temido capítulo de 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 idioma que sea tan abstracto como las mónadas en la programación funcional. Las mónadas permiten que muchas ideas (como operaciones IO, cálculos que pueden fallar, análisis sintáctico, ...) se unan bajo una sola idea. Así que no se desanime si después de leer el capítulo de las mónadas no las comprende realmente. Me pareció útil leer muchas explicaciones diferentes de mónadas; cada uno da una nueva perspectiva del problema. Aquí hay una muy buena lista de tutoriales de mónadas. Recomiendo mucho Todo sobre las Mónadas, pero los otros también son buenos

Además, lleva un tiempo que los conceptos realmente se asimilan. Esto se logra mediante el uso, pero también a través del tiempo. ¡Encuentro que a veces dormir en 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 lo hace, es posible que haskell sea tu lenguaje de programación imperativo favorito :)

Para asegurarse de que está entendiendo perfectamente el sistema de tipo Haskell, debe intentar resolverlo 20 ejercicios haskell intermedios. Esos ejercicios usan nombres divertidos de funciones como "furry" y "banana" y te ayudan a comprender bien algunos conceptos básicos de programación funcional si aún no los tienes. Una buena manera de pasar la noche con una lista de papel cubierto con flechas, unicornios, salchichas y plátanos peludos.

Intermedio

Una vez que comprenda las Mónadas, creo que ha hecho la transición de un programador haskell principiante a un haskeller intermedio. Entonces, ¿a dónde ir desde aquí? Lo primero que recomendaría (si aún no los aprendió aprendiendo mónadas) son los diversos tipos de mónadas, como Reader, Writer y State. Una vez más, Realworld haskell y All about monads da una gran cobertura de esto. Para completar su entrenamiento de mónada, aprender sobre los transformadores de mónada es una necesidad. Estos le permiten combinar diferentes tipos de Mónadas (como una Mónada de Lector y Estado) en una sola. 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. Saltarse capítulos ahora realmente no importa, siempre y cuando tengas mónadas disponibles. Simplemente elija lo que le interesa.

Con el conocimiento que tendrías ahora, deberías poder usar 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 del mundo real Haskell.

  • Comprobación rápida: Un programa de prueba muy bueno. Lo que haces es escribir un predicado que siempre debe ser verdadero (ej. length (reverse lst) == length lst) A continuación, pasa el predicado a quickCheck y generará muchos valores aleatorios (en este caso, listas) y probará que el predicado es verdadero para todos los resultados. Ver 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 marco de desarrollo web para haskell. No usa bases de datos, en cambio, una tienda de tipos de datos. Bastante buenos documentos (otros marcos populares serían chasquido y Yesod)

Además, hay muchos conceptos (como el concepto de Mónada) que eventualmente debes 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 la Typeclassopedia.

  • Aplicativo: una interfaz como las Mónadas, pero menos poderosa. Cada mónada es aplicable, pero no al revés. Esto es útil ya que hay algunos tipos que son aplicables pero que no son mónadas. Además, el código escrito usando las funciones Aplicativas a menudo es más composable que escribir el código equivalente usando las funciones de Monad. Ver Functors, Functors Applicative y Monoids del aprender una guía de Haskell.

  • Plegable,Trasables: Tipos de clases que abstraen muchas de las operaciones de las listas, de modo que las mismas funciones se pueden aplicar a otros tipos de contenedores. Ver también el haskell wiki explaination.

  • Monoide: Un Monoid es un tipo que tiene un valor cero (o mempty) y una operación, anotada <> que une dos Monoids juntos, de modo que x <> mempty = mempty <> x = x y x <> (y <> z) = (x <> y) <> z. Estas se llaman leyes de identidad y asociatividad. Muchos tipos son Monoids, como 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 antiguas funciones simples de Haskell.

  • Arrays: las diversas matrices mutables / inmutables en haskell.

  • ST Monad: le permite escribir código con un estado mutable que se ejecuta muy rápido, mientras se mantiene puro fuera de la mónada. Vea el vínculo para mas detalles.

  • FRP: Functional Reactive Programming, una nueva forma experimental de escribir código que maneja eventos, desencadenantes, entradas y salidas (como una interfaz gráfica de usuario). No sé mucho sobre esto sin embargo. La charla de Paul Hudak sobre yampa es un buen comienzo.

Hay muchas características nuevas de lenguaje que debería tener en cuenta. Voy a enumerarlos, puedes encontrar mucha información sobre ellos en google, haskell wikibook, el sitio de haskellwiki.org y documentación ghc.

  • Clases de tipo multiparámetro / dependencias funcionales
  • Escriba familias
  • Tipos cuantificados existencialmente
  • Tipos de fantasmas
  • GADTS
  • otros...

Una gran cantidad de haskell se basa en teoría de categorías, por lo que es posible que desee investigar eso. Un buen punto de partida es Teoría de la categoría para el informático. Si no quieres comprar el libro, el autor está relacionado artículo también es excelente

Finalmente, querrá aprender más sobre las diversas herramientas de Haskell. Éstas incluyen:

  • ghc (y todas sus características)
  • cábala: el sistema de paquete haskell
  • Darcs: un sistema de control de versiones distribuidas escrito en haskell, muy popular para los programas de Haskell.
  • eglefino: un generador de documentación automática Haskell

Al aprender 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, compilador) Trabajar en esto te permitirá aplicar muchas de las cosas que estás aprendiendo. Te quedas en este nivel por edades (aquí es donde estoy).

Experto

Te llevará años llegar a esta etapa (¡hola de 2009!), Pero desde aquí supongo que comienzas a escribir documentos de doctorado, nuevas extensiones de ghc y nuevas abstracciones.

Obteniendo ayuda

Finalmente, mientras se encuentra en cualquier etapa de aprendizaje, hay múltiples lugares para obtener información. Estos son:

  • el canal #haskell irc
  • el listas de correo. Vale la pena registrarse 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 ser competente en Haskell. Lleva mucho tiempo, pero eso se debe principalmente a que estás aprendiendo una forma completamente nueva de pensar 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 orientadas a objetos han mejorado como resultado del aprendizaje haskell, ya que estoy viendo muchas formas nuevas de abstraer ideas.


2318



Un colega mío tenía una buena experiencia con ¡Aprende Haskell por el bien!.

Tutorial dirigido a personas que tienen   experiencia en programación imperativa   idiomas pero no han programado en una   lenguaje funcional antes.

Y revisa las respuestas aquí también


170



Aquí hay un buen libro que puedes leer en línea: Real World Haskell

La mayoría de los programas de Haskell que he hecho han sido para resolver Proyecto Euler problemas.

Una vez, un consejo que leí no hace mucho fue que debería tener un conjunto estándar de problemas simples que sabe cómo resolver (en teoría) y luego, cuando intenta aprender un nuevo idioma, implementa esos problemas en ese idioma.


98



Disfruté viendo esta serie de 13 episodios en Programación Funcional usando Haskell.

C9 Conferencias: Dr. Erik Meijer - Fundamentos de Programación Funcional: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/


70



Para agregar las respuestas de los demás, hay una útil que te ayudará cuando codifiques (por ejemplo, cuando resuelvas problemas de proyectos de Euler): Hoogle. Puede usar la interfaz de línea de comando o interfaz web.

Línea de comando

Después de instalar la plataforma Haskell, asegúrese de cabal install hoogle

Ejemplo de uso de Hoogle:

Tienes una función f x = 3 * x + 1 y quieres aplicarlo en (5 :: Int), luego aplíquelo en el resultado y en ese resultado, y así sucesivamente, y obtenga una lista infinita de esos valores. Sospecha que quizás ya exista una función para ayudarlo (no específicamente para su f aunque).

Esa función sería de tipo (a -> a) -> a -> [a] si toma f 5 o a -> (a -> a) -> [a] si toma 5 f (suponemos que la función es para tipos generales y no solo Ints)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

Sí, la función que necesita ya existe y se llama iterate. lo usas por iterate func 5!

interfaz web

El resultado para el mismo ejemplo se puede encontrar aquí.


64



Graham Hutton's Programación en Haskell es conciso, razonablemente minucioso, y sus años de enseñanza realmente lo demuestran Haskell. Casi siempre es con lo que recomiendo que empiecen las personas, sin importar a dónde vayas desde allí.

En particular, el Capítulo 8 ("Analizadores Funcionales") proporciona la base real que necesita para comenzar a tratar con las mónadas, y creo que es de lejos el mejor lugar para comenzar, seguido de Todo sobre las Mónadas. (Con respecto a ese capítulo, sin embargo, tenga en cuenta la errata del sitio web, sin embargo: no puede usar el do forma sin alguna ayuda especial. Es posible que desee conocer primero las clases de tipos y resolver ese problema por su cuenta).

Esto rara vez se enfatiza para los principiantes de Haskell, pero vale la pena aprender desde el principio no solo sobre el uso de las mónadas, sino sobre la construcción de las propias. No es difícil, y los personalizados pueden hacer que una serie de tareas sea más simple.


53



No intente leer todos los tutoriales de mónadas con metáforas divertidas. Ellos solo te confundirán aún peor.


49



Sugiero unirme a la #haskell irc channely hacer preguntas allí. Así es como aprendí a Haskell. Si pasas por Real World Haskell como se sugirió anteriormente, las respuestas en tiempo real a tus preguntas serán de gran ayuda. Muchas personas inteligentes en #haskell escriben a Haskell por diversión y con fines de lucro, por lo que obtendrás muchas aportaciones. ¡Intentalo!


30



Estos son mis favoritos

Haskell: Programación funcional con tipos

Joeri van Eekelen, et al. | Wikibooks
       Published in 2012, 597 pages

Real World Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages

22



También puedo recomendar Sin embargo, otro tutorial de Haskell como una introducción.

Otro buen recurso de aprendizaje (probablemente en el nivel intermedio), que me ha ayudado mucho y que no ha sido mencionado en otras respuestas, hasta donde puedo ver, es el de Brent Yorgey. Typeclassopedia, que se puede encontrar en El lector de Monad (Número 13) 

Está escrito en un estilo muy accesible y contiene (entre muchas otras cosas) los siguientes consejos introductorios:

Hay dos claves para la sabiduría de un hacker Haskell experto:

  1. Comprende los tipos.

  2. Obtenga una intuición profunda para cada tipo de clase y su relación con otras   tipo de clases, respaldado por la familiaridad con muchos ejemplos.

El lector de Monad en sí mismo es un tesoro absoluto para los programadores funcionales (no solo los programadores de Haskell).


18



Intenta escribir programas fáciles en él.

Puede encontrar tareas de muestra en varios libros de texto, probablemente.

No recomendaría atenerme a los libros de texto de Haskell / FP, simplemente intente hacer cosas simples con él: cálculos, manipulaciones de cadenas, acceso a archivos.

Después de resolver una docena, rompí el hielo :)

Después de eso, lee mucho sobre conceptos avanzados (Mónadas, Flechas, IO, estructuras de datos recursivas), porque haskell es infinito y hay muchos de ellos.


13