you tutorial online learn descargar company book haskell functional-programming

tutorial - Empezando con Haskell



learn you a haskell pdf (15)

Durante unos días traté de envolver mi cabeza en torno al paradigma de la programación funcional en Haskell. Lo he hecho leyendo tutoriales y viendo screencasts, pero nada parece pegarse. Ahora, al aprender varios idiomas imperativos / OO (como C, Java, PHP), los ejercicios han sido una buena manera de hacerlo. Pero como realmente no sé de qué es capaz Haskell y porque hay muchos conceptos nuevos que utilizar, no sé por dónde empezar.

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


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 problemas del Proyecto Euler .

Un consejo que leí hace poco 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.


Creo que darme cuenta de la característica de Haskell con ejemplos es la mejor manera de comenzar por encima de todo.

http://en.wikipedia.org/wiki/Haskell_98_features

Aquí hay clases de tipos complicadas que incluyen mónadas y flechas.

Typeclassopedia

para problemas del mundo real y proyectos más grandes, recuerde estas etiquetas: GHC (compilador más usado), Hackage (libraryDB), Cabal (sistema de construcción), darcs (otro sistema de construcción).

Un sistema integrado puede ahorrar su tiempo: http://hackage.haskell.org/platform/

la base de datos del paquete para este sistema: http://hackage.haskell.org/

Wiki del compilador de GHC: http://www.haskell.org/haskellwiki/GHC

Después de Haskell_98_features y Typeclassopedia, creo que ya puedes encontrar y leer la documentación sobre ellos.

Por cierto, es posible que desee probar alguna extensión de idioma de GHC que puede ser una parte del estándar de haskell en el futuro.

Esta es mi mejor manera de aprender haskell. Espero que te pueda ayudar.



Intenta escribir programas fáciles en él.

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

No recomendaría apegarse a los libros de texto de Haskell / FP, solo intente hacer cosas simples: cálculos, manipulaciones de cadenas, acceso a archivos.

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

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


La Programación de Graham Hutton en Haskell es concisa, razonablemente exhaustiva, y sus años de enseñanza de Haskell realmente demuestran. Casi siempre es con lo que recomiendo a las personas comenzar, independientemente de a dónde vayas a partir de ahí.

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 el mejor lugar para comenzar, seguido de All About Monads . (Sin embargo, con respecto a ese capítulo, tenga en cuenta la errata del sitio web: no puede usar el formulario do sin alguna ayuda especial. Es posible que desee aprender primero sobre las clases de tipos y resolver el problema por su cuenta).

Esto rara vez se enfatiza a los principiantes de Haskell, pero vale la pena aprender bastante pronto no solo sobre el uso de mónadas, sino sobre cómo construir uno propio. No es difícil, y las personalizadas pueden hacer que algunas tareas sean más simples.


La primera respuesta es muy buena. Para llegar al nivel de Experto, debes hacer un doctorado con algunos de los Expertos.

Le sugiero que visite la página de Haskell: http://haskell.org . Ahí tienes mucho material y muchas referencias a las cosas más actualizadas en Haskell, aprobadas por la comunidad de Haskell.


Le sugiero que primero comience leyendo el tutorial de BONUS , y luego leyendo Real World Haskell (en línea de forma gratuita) . Únase al canal de IRC #Haskell, en irc.freenode.com , y haga preguntas. Estas personas son absolutamente amigables con los novatos y me han ayudado mucho con el tiempo. Además, aquí mismo, SO es un excelente lugar para obtener ayuda con cosas que no puedes entender. Trata de no desanimarte, una vez que haga clic, tu mente se volverá loca.

El tutorial de BONUS lo preparará y lo preparará para el emocionante viaje que trae Real World Haskell. ¡Te deseo suerte!


No trates de leer todos los tutoriales de mónadas con metáforas divertidas. Solo te van a mezclar aún peor.


Para agregar las respuestas de los demás, hay una útil que le ayudará a la hora de programar (por ejemplo, al resolver problemas de proyectos de Euler): Hoogle . Puede utilizar la interfaz de línea de comandos o la interfaz web .

Línea de comando

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

Ejemplo de uso de Hoogle:

Tiene una función fx = 3 * x + 1 y desea aplicarla en (5 :: Int) , luego aplicarla en el resultado y en ese resultado y así sucesivamente y obtener una lista infinita de esos valores. Sospechas que puede que ya exista una función para ayudarte (aunque no específicamente para tu f ).

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

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

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

interfaz web

El resultado para el mismo ejemplo se puede encontrar here .


Si solo tiene experiencia con idiomas imperativos / OO, sugiero usar un lenguaje funcional más convencional como un trampolín. Haskell es realmente diferente y tienes que entender muchos conceptos diferentes para llegar a cualquier lugar. Sugiero abordar primero un lenguaje de estilo ML (como p. Ej. F #).


También puedo recomendar Yet Another Haskell Tutorial como introducción.

Otro buen recurso de aprendizaje (probablemente en el nivel intermedio), que me ha ayudado mucho y no se ha mencionado en las otras respuestas por lo que puedo ver, es la Typeclassopedia de Brent Yorgey, que se puede encontrar en The Monad Reader . 13)

Está escrito en un estilo muy accesible y contiene (entre muchas otras cosas) el siguiente consejo de introducción:

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

  1. Comprender los tipos.

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

El propio Monad Reader es un tesoro absoluto para los programadores funcionales (no solo los programadores de Haskell).


Un colega mío tuvo una buena experiencia con Learn You a Haskell for Great Good! .

Tutorial dirigido a personas que tienen experiencia en lenguajes de programación imperativos pero que no han programado en un lenguaje funcional antes.

Y mira las respuestas here también


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.

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 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 aprender feliz de haskell y los primeros 6 capítulos de aprender un haskell . Mientras lees esto, es una muy buena idea resolver problemas simples con lo que sabes.

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 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 saltarse 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 cual 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 que haskell tiene 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, debe 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). Descubrí 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 haber hecho los problemas anteriores, debería encontrarlo perfectamente comprensible.

Resolver los problemas del libro es una excelente manera de aprender cómo 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 otros 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 ser que haskell sea tu 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 entiendes 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 mónadas ofrecen una gran cobertura de esto. Para completar tu entrenamiento de mónadas, aprender sobre los transformadores de mónadas es imprescindible. Estos le permiten combinar diferentes tipos de mónadas (como una mónada de lector y una de estado) en una. 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 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 haskell del mundo real.

  • Quickcheck : Un programa de prueba muy bueno. Lo que hace es escribir un predicado que siempre debería ser verdadero (por ejemplo, length (reverse lst) == length lst ). Luego pasa el predicado quickCheck, y generará una gran cantidad de valores aleatorios (en este caso, listas) y prueba que el predicado es 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. yesod bastante buenos (otros marcos populares serían 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 lidiar con el nivel de abstracción involucrado. Una descripción general muy buena para aprender sobre estos conceptos de alto nivel y cómo encajan juntos 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 texto que resumen 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 wiki de haskell .

  • Monoid : un Monoide es un tipo que tiene un valor 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.

  • Arrows : 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.

  • Arrays : los diversos 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é, 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.
  • 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 article 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.
  • haddock : 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 compiler ). 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 phd, 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
  • Las 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 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.


Yo sugeriría unirse al canal de irc #haskell y hacer preguntas allí. Así es como aprendí Haskell. Si analiza Real World Haskell como se sugirió anteriormente, las respuestas en tiempo real a sus preguntas serán de gran ayuda. Mucha gente inteligente en #haskell escribe Haskell para divertirse y obtener ganancias, por lo que obtendrás un montón de buenos comentarios. ¡Intentalo!