introalg:taller08_4
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_4 [2008/05/10 21:50] – laura | introalg:taller08_4 [2025/11/15 13:47] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 75: | Línea 75: | ||
| [False, | [False, | ||
| - | === Ejercicio === | ||
| - | * Utilizando aplicación parcial en //( /= )//, definir la función //noEsCero :: Int -> Bool// que decide si un entero //x// es distinto a 0. | + | ===== Generalización de las funciones vistas (map, filter, fold) ===== |
| - | |||
| - | |||
| - | ===== Generalización de las funciones vistas (map, filter, fold) ===== | ||
| ==== Aplicaciones (map) ==== | ==== Aplicaciones (map) ==== | ||
| Línea 128: | Línea 124: | ||
| rangoEdades (x:xs) = rangoEdad x : rangoEdades xs | rangoEdades (x:xs) = rangoEdad x : rangoEdades xs | ||
| - | | + | ___________ |
| - | [] = [] | + | |
| - | (x:xs) = | + | |
| Si queremos hacer esta expresión independiente de tipos, usaremos los comodines de tipo //a//, //b//, etc. en lugar de los tipos comunes //Int//, //String//, etc. | Si queremos hacer esta expresión independiente de tipos, usaremos los comodines de tipo //a//, //b//, etc. en lugar de los tipos comunes //Int//, //String//, etc. | ||
| - | | + | ___________ |
| - | [] = [] | + | |
| - | (x:xs) = | + | |
| A esta base común hay que añadir un argumento más: la función que se aplicará a todos los elementos de la lista. En el ejemplo anterior, la función era // | A esta base común hay que añadir un argumento más: la función que se aplicará a todos los elementos de la lista. En el ejemplo anterior, la función era // | ||
| Línea 156: | Línea 152: | ||
| cuadrados = aplicar (^2) | cuadrados = aplicar (^2) | ||
| rangoEdades = aplicar rangoEdad | rangoEdades = aplicar rangoEdad | ||
| - | |||
| - | |||
| - | === Ejercicio === | ||
| - | |||
| - | * Definir la función // | ||
| - | |||
| - | probar con mapNumeros.(*2).[0, | ||
| - | |||
| - | |||
| - | |||
| Línea 226: | Línea 212: | ||
| - | Observemos que en el caso de los filtros, los elementos de la lista resultado tienen que ser del mismo tipo que los elementos de la lista que damos como argumento (//[a] -> [a]//), ya que la función filtro **no modifica** los elementos, sino que solamente determina si deben o no deben formar parte del resultado. En cambio, en las aplicaciones el resultado puede ser de distinto tipo que el argumento (//[a] -> [b]//), porque la aplicación sí puede modificar los elementos de la lista de entrada, incluso cambiándolos de tipo. Notemos que //[a] -> [b]// significa que **podemos** encontrar tipos distintos (como en // | + | Observemos que en el caso de los filtros, los elementos de la lista resultado tienen que ser del mismo tipo que los elementos de la lista que damos como argumento (//[a] -> [a]//), ya que la función filtro **no modifica** los elementos, sino que solamente determina si deben o no deben formar parte del resultado. En cambio, en las aplicaciones el resultado puede ser de distinto tipo que el argumento (//[a] -> [b]//), porque la aplicación sí puede modificar los elementos de la lista de entrada, incluso cambiándolos de tipo. Notemos que //[a] -> [b]// significa que **podemos** encontrar tipos distintos (como en // |
| - | + | ||
| - | === Ejercicio === | + | |
| - | + | ||
| - | * Definir la función // | + | |
| - | + | ||
| - | probar con filtraNumeros.entre0y9.[], | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| Línea 281: | Línea 257: | ||
| Por lo tanto, la generalización de los acumuladores es la siguiente: | Por lo tanto, la generalización de los acumuladores es la siguiente: | ||
| - | acumular :: (a -> b ->) -> b -> [a] -> b | + | acumular :: (a -> b -> b) -> b -> [a] -> b |
| acumular f n [] = n | acumular f n [] = n | ||
| acumular f n (x:xs) = f x (acumular f n xs) | acumular f n (x:xs) = f x (acumular f n xs) | ||
| Línea 297: | Línea 273: | ||
| concatenaInt = acumular (++) [] | concatenaInt = acumular (++) [] | ||
| - | |||
| - | === Ejercicio === | ||
| - | |||
| - | Definir la primera generalización. | ||
| - | |||
| - | * Definir la función // | ||
| - | |||
| - | probar con paraTodoInt.multiplo2.[2, | ||
| - | |||
| - | Y luego esta que es casi completa. | ||
| - | |||
| - | * Definir la función // | ||
| - | |||
| - | probar con acumulaInt.(+).0.[1, | ||
| ===== Ejercicios ===== | ===== Ejercicios ===== | ||
| Línea 316: | Línea 278: | ||
| * Escribir // | * Escribir // | ||
| * Reescribir ambas utilizando aplicación parcial sobre //mapa// para evitar escribir el argumento de la lista. | * Reescribir ambas utilizando aplicación parcial sobre //mapa// para evitar escribir el argumento de la lista. | ||
| - | * Utilizando //aplicar// escribir la función //largos :: [String] -> [Int]// que dada una lista de cadenas, retorna la lista con la longitud de cada una. | + | * Utilizando //aplicar// escribir la función //largos :: [String] -> [Int]// que dada una lista de strings, retorna la lista con la longitud de cada una. //Ayuda: recordar que los strings son listas de caracteres.// |
| * Escribir // | * Escribir // | ||
| * Reescribir ambas utilizando aplicación parcial sobre //aplicar// para evitar escribir el argumento de la lista. | * Reescribir ambas utilizando aplicación parcial sobre //aplicar// para evitar escribir el argumento de la lista. | ||
| Línea 328: | Línea 290: | ||
| * Definir la función // | * Definir la función // | ||
| * Definir la función // | * Definir la función // | ||
| - | * Definir la función // | + | * Definir la función // |
| - | * Definir la función // | + | * Definir la función // |
| - | * Definir la función // | + | * Definir la función // |
| * Definir la función // | * Definir la función // | ||
| * Definir la función // | * Definir la función // | ||
introalg/taller08_4.1210467027.txt.gz · Última modificación: (editor externo)
