Fundamentos del lenguaje
27 pasos en 9 series de Haskell.
Haskell es el lenguaje donde el sistema de tipos hace el trabajo pesado: funciones puras por defecto, efectos marcados en los tipos y un compilador que atrapa categorías enteras de errores antes de que algo corra. Se lee menos como instrucciones y más como definiciones — un programa es un conjunto de ecuaciones, y GHC descubre cómo correrlas de forma perezosa, solo a medida que se piden los resultados.
Este tour cubre el núcleo de trabajo en GHC2021 pelado — sin extensiones: vinculaciones con firmas, currificación y composición, coincidencia de patrones con guardas, listas y comprensiones, el trío map/filter/fold, tipos de datos algebraicos y registros, clases de tipos con deriving e instancias escritas a mano, y apenas la notación do necesaria para imprimir resultados. El bis entrega programas completos. Cada fragmento pasa el chequeo de tipos bajo ghc -Wall con las advertencias como errores, y el bis corre de principio a fin.
Valores y tipos
- Vinculaciones y firmasEl perfil de un sendero escrito como vinculaciones de nivel superior, cada una con su firma de tipo.
- Aritmética entera y fraccionariaPrepara tazas con una bolsa de granos y mantiene separadas la aritmética entera y la fraccionaria.
- Cadenas y caracteresRearma el anuncio de una puerta de embarque, porque un
Stringno es más que una lista de caracteres.
Funciones
- Definir funcionesUna cotización de envío armada con dos funciones chicas y un patrón literal.
- Currificación y aplicación parcialUna calculadora de propinas que entrega funciones a medio aplicar en vez de números.
- Composición y pipelinesCuenta palabras de dos maneras y pone lado a lado el estilo point-free y el estilo con argumentos.
Coincidencia de patrones
- case y formas de listaLee un corredor de semáforos con expresiones
casesobre un tipo suma. - Guardas y whereConvierte un semestre de puntajes de examen en una nota con letra y un comentario adjunto.
- Tuplas y paresEmpareja filas de asientos con conteos de boletos y después saca la fila más ocupada.
Listas
- Construir listas
(:)agrega un elemento al frente,(++)une dos listas enteras y un patrón cubre el caso vacío. - Rangos
[6 .. 10]cuenta de uno en uno; nombrar los dos primeros elementos elige cualquier otro paso. - Comprensiones de listasLos generadores a la derecha de la barra alimentan la expresión de la izquierda; las guardas descartan lo que falla.
Orden superior
- map y filter
mapreescribe cada elemento,filterconserva los que pasan y(.)encadena los dos en un pipeline. - Folds
foldryfoldl'colapsan una lista en un solo valor; difieren en la dirección y en cuándo ocurre el trabajo. - Lambdas y seccionesUna lambda es una función sin nombre; una sección es un operador con un operando ya puesto.
Tipos y registros
- Tipos sumaUn tipo suma enumera todos los valores que el tipo admite, y
derivingescribe el código de impresión y comparación. - RegistrosLa sintaxis de registros nombra cada campo, define un accesor por campo y copia un valor con cambios.
- Maybe y Either
Maybereporta un valor ausente comoNothing;Eitherlleva un motivo en elLeft.
Clases de tipos
- Derivar instanciasUna cláusula
derivingen un tipo suma aporta gratis Show, Eq, Ord, Enum y Bounded. - Instancias propiasInstancias
ShowyEqescritas a mano deciden cómo se imprime un valor y qué cuenta como igual. - Ord y ordenamientoTres ordenamientos de una lista:
sortBycon comparador,sortOncon clave yDownpara invertir.
Fundamentos de IO
- Secuenciar IO con doUn bloque
docorre acciones de IO de arriba abajo y llama a una función pura a mitad de camino. - let frente a bind en IODentro de
do,letnombra un valor puro mientras<-ejecuta una acción y vincula su resultado. - Imprimir con mapM_
mapM_corre una acción por elemento y descarta los resultados;forM_es igual con los argumentos al revés.
Bis
- word_freq.hsCuenta frecuencias de palabras en un pasaje incrustado e imprime las ocho primeras con totales.
- grade_report.hsPromedia los puntajes de cada estudiante, asigna nota con letra e imprime una tabla ordenada con resumen del curso.
- temp_stats.hsReporta una semana de máximas diarias con el mínimo, el máximo, la media y una barra al lado de cada día.