RecursividadRecursividad sobre listasFold- Finalmente definimos las funciones sumatoria, productoria y "andtoria" (hacer and de toda una lista de booleanos). Vemos que tienen una estructura muy similar:
sumatoria [] = 0 sumatoria (x:xs) = x + sumatoria xs
productoria [] = 1 productoria (x:xs) = x * productoria xs
andtoria [] = True andtoria (x:xs) = x && andtoria xs
- MƔs concreatamente las tres tienen la misma estructura, y lo que cambia es:
- La operación que hago entre los elementos (suma, multiplicación, and)
- El valor base para la lista vacĆa (0, 1 o True).
- Entonces eso nos permitirĆa hacer una Ćŗnica función que reciba esas diferencias como parĆ”metro, en Haskell esa función se llama foldr:
foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs)
- Con esa definición ahora podemos redefinir las anteriores de la siguiente manera:
sumatoria = foldr (+) 0 productoria = foldr (*) 1 andtoria = foldr (&&) True
- ¿Qué relación hay entre las operaciones y los valores base?
Podemos ver que cada valor base es el valor neutro de la operación que podemos hacer.
- También se puede mencionar que el fold es mÔs genérico que lo que hicimos hasta ahora ya que pusimos sólo ejemplos en los que el valor devuelto es del mismo tipo que los elementos de la lista, esto no tiene que ser asà siempre. Pero vamos a dejar esos ejemplos para mÔs adelante.
- Un ejemplo que sĆ podemos ver es el de la función mĆnimo. La diferencia entre esta función y las anteriores es que no es posible elegir un valor entero que sea neutro de la operación "mĆnimo entre dos valores". La forma mĆ”s prolija de solucionar este inconveniente es tomar como valor inicial al primer elemento de la lista.
Eso en Haskell estÔ hecho con la función foldr1:
foldr1 f (x:xs) = foldr f x xs
Eso nos permite luego definir la función minimum asĆ:
minimum = foldr1 min
Donde min es la función que me da el mĆnimo entre dos valores (ya viene con el Haskell)
Ejercicios para practicar- Lo que me parece mĆ”s importante a esta altura es completar toda la guĆa nĆŗmero 2, que tiene ejercicios de composición, aplicación parcial y orden superior incluyendo listas y fold.
- Para practicar recursividad pueden mirar la guĆa nĆŗmero 3.
|
|