Introducción
- JavaScript funcional
- Tipos e inferencia de tipos
- Programación web políglota
- Prerrequisitos
- Sobre ti
- Cómo leer este libro
- Consiguiendo ayuda
- Acerca del autor
- Acerca de la traducción
- Agradecimientos
Empezando
- Objetivos del capítulo
- Introducción
- Instalando PureScript
- Instalando las herramientas
- ¡Hola, PureScript!
- Compilando para el navegador
- Quitando código no usado
- Compilando módulos CommonJS
- Seguimiento de dependencias con Bower
- Calculando diagonales
- Probando el código usando el modo interactivo
- Ejercicios
- Conclusión
Funciones y registros (records)
- Objetivos del capítulo
- Preparación del proyecto
- Tipos simples
- Tipos cuantificados
- Notas sobre la sangría (indentation)
- Definiendo nuestros tipos
- Constructores de tipo (type constructors) y familias (kinds)
- Mostrando entradas de la agenda
- Prueba temprano, prueba a menudo
- Creando agendas
- Funciones currificadas (curried functions)
- Consultando la agenda
- Aplicación de funciones infija
- Composición de funciones
- Prueba, prueba, prueba…
- Ejercicios
- Conclusión
Recursividad, asociaciones (maps) y pliegues (folds)
- Objetivos del capítulo
- Preparación del proyecto
- Introducción
- Recursividad sobre arrays
- Ejercicios
- Asociaciones (maps)
- Operadores infijos
- Filtrando arrays
- Ejercicios
- Aplanando arrays
- Arrays por comprensión (array comprehensions)
- Notación ‘do’ (do notation)
- Guardas (guards)
- Ejercicios
- Pliegues (folds)
- Recursividad final (tail recursion)
- Acumuladores (accumulators)
- Prefiere pliegues a recursividad explícita
- Ejercicios
- Un sistema de ficheros virtual
- Listando todos los ficheros
- Ejercicios
- Conclusión
Ajuste de patrones (pattern matching)
- Objetivos del capítulo
- Preparación del proyecto
- Ajuste de patrones simple
- Patrones simples
- Guardas
- Ejercicios
- Patrones de array (array patterns)
- Patrones de registro (record patterns) y polimorfismo de fila (row polymorphism)
- Patrones anidados (nested patterns)
- Patrones nombrados (named patterns)
- Ejercicios
- Expresiones “case” (case expressions)
- Fallos de ajuste de patrones (pattern match failures) y funciones parciales (partial functions)
- Tipos de datos algebraicos (algebraic data types)
- Usando ADTs
- Doble sentido en registros (record puns)
- Ejercicios
- Newtypes
- Una biblioteca para gráficos vectoriales
- Calculando rectángulos de delimitación
- Ejercicios
- Conclusión
Clases de tipos (type classes)
- Objetivos del capítulo
- Preparación del proyecto
- Ejercicios
- Clases de tipos comunes
- Ejercicios
- Anotaciones de tipo (type annotations)
- Instancias superpuestas (overlapping instances)
- Dependencias de instancia (instance dependencies)
- Ejercicios
- Clases de tipos de varios parámetros (multi parameter type classes)
- Dependencias funcionales (functional dependencies)
- Clases de tipos nularias (nullary type classes)
- Superclases (superclasses)
- Ejercicios
- Una clase de tipos para funciones resumen
- Ejercicios
- Conclusión
Validación aplicativa (applicative validation)
- Objetivos del capítulo
- Preparación del proyecto
- Generalizando la aplicación de funciones
- Elevando funciones arbitrarias
- La clase de tipos Applicative
- Intuición para Applicative
- Más efectos
- Combinando efectos
- Ejercicios
- Validación aplicativa
- Validadores con expresiones regulares (regular expression validators)
- Ejercicios
- Funtores transitables (traversable functors)
- Ejercicios
- Funtores aplicativos para paralelismo
- Conclusión
La mónada Eff
- Objetivos del capítulo
- Preparación del proyecto
- La clase de tipos mónada
- Leyes de la mónada
- Plegando con mónadas
- Mónadas y aplicativos
- Ejercicios
- Efectos nativos (native effects)
- Efectos secundarios y pureza
- La mónada Eff
- Efectos extensibles (extensible effects)
- Intercalando efectos
- La familia de Eff
- Objetos y filas
- Efectos de grano fino (fine-grained effects)
- Gestores (handlers) y acciones (actions)
- Estado mutable
- Ejercicios
- Efectos DOM
- Una interfaz de usuario para la agenda
- Ejercicios
- Conclusión
Gráficos con Canvas
- Objetivos del capítulo
- Preparación del proyecto
- Formas simples
- Haciendo uso del polimorfismo de fila
- Ejercicios
- Dibujando círculos aleatorios
- Transformaciones
- Preservando el contexto
- Estado mutable global
- Ejemplos
- Sistemas-L
- Ejercicios
- Conclusión
Interfaz para funciones externas (foreign function interface)
- Objetivos del capítulo
- Preparación del proyecto
- Una advertencia
- Llamando a PureScript desde JavaScript
- Entendiendo la generación de nombres
- Representación de datos en tiempo de ejecución (runtime data representation)
- Representando ADTs
- Representando tipos cuantificados
- Representando tipos restringidos
- Ejercicios
- Usando código JavaScript desde PureScript
- Envolviendo valores JavaScript
- Definiendo tipos externos
- Funciones de múltiples argumentos
- Representando efectos secundarios
- Definiendo nuevos efectos
- Ejercicios
- Trabajando con datos no tipados
- Gestionando valores nulos e indefinidos
- Serialización genérica de JSON
- Ejercicios
- Conclusión
Aventuras monádicas
- Objetivos del capítulo
- Preparación del proyecto
- Cómo jugar
- La mónada State
- Ejercicios
- La mónada Reader
- Ejercicios
- La mónada Writer
- Ejercicios
- Transformadores de mónada (monad transformers)
- El transformador de mónada ExceptT
- Pilas de transformadores de mónada (monad transformer stacks)
- Ejercicios
- ¡Clases de tipos al rescate!
- Alternativas
- Mónadas por comprensión
- Retroceso (backtracking)
- Ejercicios
- La mónada RWS
- Implementando la lógica del juego
- Ejecutando el cálculo
- Ejercicios
- Gestionando opciones de línea de comandos
- Ejercicios
- Conclusión
El infierno de retrollamadas (callback hell)
- Objetivos del capítulo
- Preparación del proyecto
- El problema
- La mónada de continuación
- Ejercicios
- Poniendo ExceptT a trabajar
- Ejercicios
- Un cliente HTTP
- Ejercicios
- Cálculos paralelos
- Ejercicios
- Conclusión
Verificación generativa (generative testing)
- Objetivos del capítulo
- Preparación del proyecto
- Escribiendo propiedades
- Mejorando los mensajes de error
- Ejercicios
- Verificando código polimórfico
- Ejercicios
- Generando datos arbitrarios
- Ejercicios
- Probando funciones de orden mayor
- Escribiendo instancias de Coarbitrary
- Verificando sin efectos secundarios
- Ejercicios
- Conclusión
Lenguajes específicos del dominio (domain-specific languages)
- Objetivos del capítulo
- Preparación del proyecto
- Un tipo de datos HTML
- Constructores inteligentes (smart constructors)
- Ejercicios
- Tipos fantasma (phantom types)
- Ejercicios
- La mónada libre (free monad)
- Interpretando la mónada
- Ejercicios
- Extendiendo el lenguaje
- Ejercicios
- Conclusión
