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/11 00:35] – laura | introalg:taller08_4 [2018/08/10 03:03] (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 298: | Línea 274: | ||
- | === Ejercicio | + | ===== Ejercicios |
- | + | ||
- | 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, | + | |
- | + | ||
- | + | ||
- | ===== Reescribiendo funciones usando map, fold y filter ===== | + | |
- | + | ||
- | + | ||
- | ==== Ejercicios | + | |
* 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 329: | Línea 287: | ||
* Escribir //reversa// usando // | * Escribir //reversa// usando // | ||
* **(DIFÍCIL)** Escribir //aplicar// y //filtrar// usando // | * **(DIFÍCIL)** Escribir //aplicar// y //filtrar// usando // | ||
+ | * 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.1210466147.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)