En este tema, exploraremos tres funciones fundamentales en la programación funcional: map, filter y fold. Estas funciones son herramientas poderosas para manipular listas y otras estructuras de datos en Haskell.

Map

La función map aplica una función a cada elemento de una lista, produciendo una nueva lista con los resultados.

Sintaxis

map :: (a -> b) -> [a] -> [b]

Ejemplo

-- Definimos una función que suma 1 a un número
increment :: Int -> Int
increment x = x + 1

-- Usamos map para aplicar 'increment' a cada elemento de la lista
result = map increment [1, 2, 3, 4, 5]
-- result será [2, 3, 4, 5, 6]

Explicación

  1. increment es una función que toma un entero y devuelve ese entero incrementado en 1.
  2. map increment [1, 2, 3, 4, 5] aplica increment a cada elemento de la lista [1, 2, 3, 4, 5], produciendo [2, 3, 4, 5, 6].

Filter

La función filter selecciona elementos de una lista que cumplen con un predicado (una función que devuelve True o False).

Sintaxis

filter :: (a -> Bool) -> [a] -> [a]

Ejemplo

-- Definimos una función que verifica si un número es par
isEven :: Int -> Bool
isEven x = x `mod` 2 == 0

-- Usamos filter para seleccionar solo los números pares de la lista
result = filter isEven [1, 2, 3, 4, 5, 6]
-- result será [2, 4, 6]

Explicación

  1. isEven es una función que toma un entero y devuelve True si el entero es par.
  2. filter isEven [1, 2, 3, 4, 5, 6] selecciona solo los elementos de la lista [1, 2, 3, 4, 5, 6] que son pares, produciendo [2, 4, 6].

Fold

La función fold (también conocida como reduce en otros lenguajes) combina los elementos de una lista usando una función binaria y un valor inicial.

Sintaxis

Hay dos variantes principales de fold en Haskell: foldl (fold left) y foldr (fold right).

foldl :: (b -> a -> b) -> b -> [a] -> b
foldr :: (a -> b -> b) -> b -> [a] -> b

Ejemplo con foldl

-- Definimos una función que suma dos números
add :: Int -> Int -> Int
add x y = x + y

-- Usamos foldl para sumar todos los elementos de la lista
result = foldl add 0 [1, 2, 3, 4, 5]
-- result será 15

Ejemplo con foldr

-- Definimos una función que suma dos números
add :: Int -> Int -> Int
add x y = x + y

-- Usamos foldr para sumar todos los elementos de la lista
result = foldr add 0 [1, 2, 3, 4, 5]
-- result será 15

Explicación

  1. add es una función que toma dos enteros y devuelve su suma.
  2. foldl add 0 [1, 2, 3, 4, 5] combina los elementos de la lista [1, 2, 3, 4, 5] usando add, comenzando con el valor inicial 0. El proceso es: ((((0 + 1) + 2) + 3) + 4) + 5.
  3. foldr add 0 [1, 2, 3, 4, 5] combina los elementos de la lista [1, 2, 3, 4, 5] usando add, comenzando con el valor inicial 0. El proceso es: 1 + (2 + (3 + (4 + (5 + 0)))).

Ejercicios Prácticos

Ejercicio 1: Uso de map

Problema: Dada una lista de enteros, usa map para crear una nueva lista donde cada elemento es el cuadrado del elemento original.

Solución:

square :: Int -> Int
square x = x * x

squaredList = map square [1, 2, 3, 4, 5]
-- squaredList será [1, 4, 9, 16, 25]

Ejercicio 2: Uso de filter

Problema: Dada una lista de enteros, usa filter para crear una nueva lista que contenga solo los números mayores que 3.

Solución:

greaterThanThree :: Int -> Bool
greaterThanThree x = x > 3

filteredList = filter greaterThanThree [1, 2, 3, 4, 5, 6]
-- filteredList será [4, 5, 6]

Ejercicio 3: Uso de fold

Problema: Dada una lista de enteros, usa foldl para calcular el producto de todos los elementos de la lista.

Solución:

multiply :: Int -> Int -> Int
multiply x y = x * y

productOfList = foldl multiply 1 [1, 2, 3, 4, 5]
-- productOfList será 120

Resumen

En esta sección, hemos aprendido sobre tres funciones fundamentales en Haskell: map, filter y fold. Estas funciones nos permiten transformar y combinar listas de manera concisa y expresiva. Asegúrate de practicar con los ejercicios proporcionados para reforzar tu comprensión de estos conceptos. En el próximo módulo, exploraremos más sobre las expresiones lambda y cómo pueden ser utilizadas en combinación con estas funciones.

© Copyright 2024. Todos los derechos reservados