mineduc escolares escolar cursos curso cra bibliotecas biblioteca bibliocra abies haskell idioms

escolares - Recursos para el aprendizaje de Haskell idiomático(reducción eta, operadores de infijo simbólicos, bibliotecas, etc.)



curso cra 2018 (2)

A pesar de cierta experiencia con Lisp y ML, tengo muchos problemas para aprender a leer y (idiomáticamente) escribir Haskell porque el estilo local parece ser

  • hacer la eliminación de eta siempre que sea posible
  • evite los paréntesis en favor de explotar la precedencia del operador
  • Empaque la mitad de su lógica en cargas completas de operadores infijos no alfanuméricos sobrecargados

El último es particularmente difícil porque hay tantos operadores predefinidos, cada uno con sus propias convenciones y semántica general, que a menudo la lectura de Haskell se convierte en un ejercicio en Hoogle y :type .

¿Hay algún buen tutorial que asuma el conocimiento de conceptos funcionales / CS y, en su lugar, se centre en modismos específicos de Haskell? Estoy buscando algo como Real-World Haskell, que comienza con un programa muy ingenuo y explícito, y luego lo transforma gradualmente en un estilo más idiomático, introduciendo y explicando los modismos a medida que avanzan. Pero en lugar de introducir y explicar conceptos generales como mónadas y clases de tipos, introduciría mónadas específicas y clases de tipos específicas, como "¡pero esto es exactamente lo que hace el monoide alternativo!"


Creo que el tutorial "Escribe un esquema en 48 horas" es exactamente lo que estás buscando. Este tutorial explica cómo implementar un intérprete de esquema en Haskell; Es el único documento que realmente hizo que todo hiciera clic para mí.

Tiene ejemplos concretos de varios modismos e ideas de Haskell, todo en un proyecto genial. Esto es particularmente bueno para alguien con experiencia en Lisp, especialmente si ha leído algo como SICP o si ha implementado un intérprete de Scheme anteriormente. El tutorial es genial de cualquier manera, pero podría ser un poco más fácil de seguir si has hecho algo similar antes.


Las clases de tipos básicos como Show , Eq y Ord deben ser fáciles de comprender al leer la documentación de la biblioteca que se encuentra en Hoogle y / o Haskell-2010 Language Report .

La torre numérica en Haskell parece estar enrevesada (el tipo Int es una instancia de las clases de tipos de whooping 11 según el informe), pero solo es compatible con todos los tipos útiles de números y representaciones numéricas que los matemáticos inventaron para nosotros: por ejemplo, el número Integer es arbitrario el entero de tamaño, Int es un entero de tamaño de palabra de máquina habitual, y una representación perezosa de enteros de Peano (no en la biblioteca estándar) resultó útil en la implementación de algoritmos de grafos. Las clases de tipo numérico más importantes son Num y Integral . Puede convertir entre diferentes tipos de enteros utilizando fromIntegral funciones fromIntegral . Tenga en cuenta también que los números como 123 tienen el tipo Num a => a ay hay un mecanismo especial de tipo predeterminado diseñado para reducir la necesidad de declaraciones de tipo para especificar el tipo numérico exacto que necesita. En casos de uso avanzados, esto funciona en su contra, por lo que es posible que desee modificar los valores predeterminados.

La misma situación es con diferentes tipos de cadenas: no hay una representación única para todos, por lo que muchas de ellas están en libertad: String , Data.ByteString y Data.Text son las más importantes.

En cuanto a las clases de tipos más complicadas, la mejor fuente es Typeclassopedia .

Para ciertos tipos de clases como Monad , Applicative y Arrow hay muchos tutoriales dedicados y trabajos de investigación. Dependiendo de sus habilidades matemáticas, es posible que también desee leer trabajos de investigación originales sobre los conceptos de la teoría de categorías detrás de las clases de tipos, como las excelentes "Nociones de computación y mónadas" de Eugenio Moggi.

En cuanto a las "reducciones eta", se denomina estilo sin puntos . Puede obtener información de las referencias mencionadas en ese enlace. También puede consultar Combinatory Logic, un artículo de 1978 de John Backus. ¿Se puede liberar la programación del estilo de von neumann? y el lenguaje de programación APL para obtener una perspectiva histórica más rica en el estilo sin puntos.

También hay libros generales sobre Haskell, como ''Una introducción suave a Haskell'' y ''Aprende un Haskell para un gran bien''.

En cuanto a la precedencia del operador, hay muy pocos operadores que debe recordar: (.) , ($) Y (>>=) se usan mucho más que todo lo demás (salvo los aritméticos, por supuesto, pero los operadores aritméticos son bastante sorprendentes).

La sintaxis de las tuplas y las listas tampoco me parece problemática. Es simplemente redundante: foo : bar : [] es lo mismo que [foo, bar] y (,) foo bar es lo mismo que (foo, bar) . Las versiones de prefijo de tuplas de mayor aridad como (,,,,) rara vez se utilizan.

Consulte también http://www.haskell.org/haskellwiki/Section_of_an_infix_operator para obtener una explicación de construcciones como (+ 2) y (2 +) secciones llamadas.

También puede aprender de los cambios que sugiere la herramienta HLint para mejorar su código. El ejecutable de HLint puede ser instalado por cabal install HLint .

En cuanto a los temas avanzados, puedo recomendar el estudio de estructuras de datos puramente funcionales (le permite diseñar estructuras de datos inmutables eficientes y la razón del consumo de tiempo), llame por necesidad el cálculo lambda (le permite razonar sobre qué se evalúa y en qué orden), Tipo de sistema Fc sistema (le proporciona algunos antecedentes sobre cómo funciona el comprobador de tipos de haskell), semántica denotacional (razonamiento sobre la no terminación, parcialidad y recursión, y también una idea de las nociones de rigor, pureza y capacidad de composición).