introalg:taller08_5
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| introalg:taller08_5 [2008/05/26 23:13] – laura | introalg:taller08_5 [2025/11/15 13:47] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 20: | Línea 20: | ||
| longitud xs = foldr (+) 0 xs | longitud xs = foldr (+) 0 xs | ||
| - | Pero esta función no anda! ¿por qué? porque el operador //+// requiere que sus argumentos sean números, y la declaración de tipos de //cuentaCuantosCumplen// no nos garantiza que la lista sea de números. Por lo tanto, habrá que garantizarlo de alguna forma: convirtiendo los elementos de la lista a números. Y además, no sólo queremos convertirlos a números, queremos convertirlos de forma que se cuente 1 por cada elemento de la lista, así que vamos a tener que convertir todos los elementos en 1. Sabemos todo esto, pero cómo lo hacemos? | + | Pero esta función no anda! ¿por qué? porque el operador //+// requiere que sus argumentos sean números, y la declaración de tipos de //longitud// no nos garantiza que la lista sea de números. Por lo tanto, habrá que garantizarlo de alguna forma: convirtiendo los elementos de la lista a números. Y además, no sólo queremos convertirlos a números, queremos convertirlos de forma que se cuente 1 por cada elemento de la lista, así que vamos a tener que convertir todos los elementos en 1. Sabemos todo esto, pero cómo lo hacemos? |
| Para darnos cuenta de qué funciones hay que combinar y cómo hay que hacerlo, podemos pensar intuitivamente en lo que hay que hacer para resolver la tarea que se propone en la función, paso a paso. En primer lugar, habrá que convertir todos los elementos de la lista en 1, en segundo lugar, habrá que sumar todos esos 1 para llegar a un número que será el total de elementos. | Para darnos cuenta de qué funciones hay que combinar y cómo hay que hacerlo, podemos pensar intuitivamente en lo que hay que hacer para resolver la tarea que se propone en la función, paso a paso. En primer lugar, habrá que convertir todos los elementos de la lista en 1, en segundo lugar, habrá que sumar todos esos 1 para llegar a un número que será el total de elementos. | ||
| Línea 27: | Línea 27: | ||
| sea1 :: a -> Int | sea1 :: a -> Int | ||
| - | sea1 = 1 | + | sea1 x = 1 |
| Ahora lo que tenemos que hacer es aplicar esta función a nuestra lista, mediante la función que generaliza la aplicación, | Ahora lo que tenemos que hacer es aplicar esta función a nuestra lista, mediante la función que generaliza la aplicación, | ||
| Línea 37: | Línea 37: | ||
| longitud :: [a] -> Int | longitud :: [a] -> Int | ||
| + | longitud xs = foldr (+) 0 (convierte1 xs) | ||
| + | |||
| + | o bien, reemplazando // | ||
| + | |||
| longitud xs = foldr (+) 0 (map sea1 xs) | longitud xs = foldr (+) 0 (map sea1 xs) | ||
| Línea 46: | Línea 50: | ||
| filtraCuantosCumplen p xs = filter p xs | filtraCuantosCumplen p xs = filter p xs | ||
| - | Esta función //filtraCuantos// nos devolverá una lista que contiene únicamente los elementos de la lista original que cumplen con el predicado //p//. Ahora necesitamos contar cuántos son estos elementos. Para eso podemos aplicar la función // | + | Esta función //filtraCuantosCumplen// nos devolverá una lista que contiene únicamente los elementos de la lista original que cumplen con el predicado //p//. Ahora necesitamos contar cuántos son estos elementos. Para eso podemos aplicar la función // |
| - | | + | |
| - | | + | |
| La función // | La función // | ||
| cuantosCumplen :: (a -> Bool) -> [a] -> Int | cuantosCumplen :: (a -> Bool) -> [a] -> Int | ||
| - | cuantosCumplen p xs = cuentaCuantosCumplen | + | cuantosCumplen p xs = cuenta |
| - | + | ||
| - | esto también se puede escribir así, en Haskell: | + | |
| - | + | ||
| - | cuantosCumplen p xs = cuentaCuantosCumplen . filtraCuantosCumplen xs | + | |
| O también lo podemos escribir así: | O también lo podemos escribir así: | ||
| Línea 122: | Línea 122: | ||
| Para practicar el tratamiento de casos complejos, recomendamos los ejercicios de la clase anterior, que copiamos en la sección de ejercicios. | Para practicar el tratamiento de casos complejos, recomendamos los ejercicios de la clase anterior, que copiamos en la sección de ejercicios. | ||
| + | |||
| Línea 156: | Línea 157: | ||
| encuentraEstafador :: [Int] -> [Int] -> [Int] | encuentraEstafador :: [Int] -> [Int] -> [Int] | ||
| encuentraEstafador [] _ = [] | encuentraEstafador [] _ = [] | ||
| - | encuentraEstafador (x:xs) ys | existe | + | encuentraEstafador (x:xs) ys | existe x ys = x : encuentraEstafador xs ys |
| | otherwise | | otherwise | ||
introalg/taller08_5.1211854381.txt.gz · Última modificación: (editor externo)
