Introducción
En Haskell, los funtores aplicativos (o simplemente aplicativos) son una abstracción que permite aplicar funciones contenidas en contextos (como Maybe, List, etc.) a valores también contenidos en contextos. Los aplicativos son más poderosos que los funtores, pero menos que las mónadas. Este módulo te enseñará cómo funcionan los aplicativos y cómo puedes utilizarlos en tus programas Haskell.
Conceptos Clave
- Funtor Aplicativo: Una estructura que permite aplicar funciones dentro de un contexto.
- Clase de Tipo
Applicative: Define las operaciones necesarias para trabajar con funtores aplicativos. - Operadores
purey<*>: Los operadores fundamentales para trabajar con aplicativos.
Clase de Tipo Applicative
La clase de tipo Applicative se define en el módulo Control.Applicative y es una extensión de la clase Functor. Aquí está la definición simplificada:
pure: Toma un valor y lo coloca en un contexto.<*>: Toma una función en un contexto y un valor en un contexto, y aplica la función al valor.
Ejemplos Prácticos
Ejemplo 1: Maybe como Aplicativo
El tipo Maybe es un ejemplo común de un funtor aplicativo. Aquí hay un ejemplo de cómo usar pure y <*> con Maybe:
import Control.Applicative
-- Usando `pure` para colocar un valor en un contexto `Maybe`
example1 :: Maybe Int
example1 = pure 5
-- Resultado: Just 5
-- Usando `<*>` para aplicar una función en un contexto `Maybe`
example2 :: Maybe Int
example2 = Just (+3) <*> Just 5
-- Resultado: Just 8
-- Usando `<*>` con un `Nothing`
example3 :: Maybe Int
example3 = Just (+3) <*> Nothing
-- Resultado: NothingEjemplo 2: Listas como Aplicativos
Las listas también son funtores aplicativos. Aquí hay un ejemplo:
-- Usando `pure` con listas
example4 :: [Int]
example4 = pure 5
-- Resultado: [5]
-- Usando `<*>` con listas
example5 :: [Int]
example5 = [(+1), (*2)] <*> [1, 2, 3]
-- Resultado: [2,3,4,2,4,6]Ejemplo 3: Aplicativos en Expresiones
Los aplicativos son útiles para trabajar con múltiples contextos. Aquí hay un ejemplo más complejo:
-- Usando `pure` y `<*>` en una expresión
example6 :: Maybe Int
example6 = pure (+) <*> Just 3 <*> Just 5
-- Resultado: Just 8
-- Usando `pure` y `<*>` con listas
example7 :: [Int]
example7 = pure (+) <*> [1, 2] <*> [3, 4]
-- Resultado: [4,5,5,6]Ejercicios Prácticos
Ejercicio 1: Aplicar Funciones en Contextos Maybe
Dado el siguiente código, completa las expresiones para que el resultado sea Just 10:
import Control.Applicative
-- Completa las expresiones
exercise1 :: Maybe Int
exercise1 = pure (*) <*> Just 2 <*> Just 5Ejercicio 2: Aplicar Funciones en Listas
Dado el siguiente código, completa las expresiones para que el resultado sea [4, 5, 6, 5, 6, 7]:
Soluciones
Solución al Ejercicio 1
import Control.Applicative
exercise1 :: Maybe Int
exercise1 = pure (*) <*> Just 2 <*> Just 5
-- Resultado: Just 10Solución al Ejercicio 2
Conclusión
En este módulo, hemos aprendido sobre los funtores aplicativos y cómo utilizarlos en Haskell. Hemos visto cómo la clase de tipo Applicative extiende Functor y proporciona las operaciones pure y <*> para trabajar con funciones y valores en contextos. Los ejemplos y ejercicios prácticos te ayudarán a consolidar estos conceptos y aplicarlos en tus propios programas.
En el próximo módulo, exploraremos los transformadores de mónadas, una herramienta poderosa para trabajar con múltiples contextos anidados.
Curso de Programación en Haskell
Módulo 1: Introducción a Haskell
- ¿Qué es Haskell?
- Configuración del Entorno de Haskell
- Sintaxis Básica y Hola Mundo
- Haskell REPL (GHCi)
