introalg:taller3
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:taller3 [2006/05/15 21:27] – nicolasw | introalg:taller3 [2025/11/15 13:47] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| ===== Plan para hoy ===== | ===== Plan para hoy ===== | ||
| + | * Revisar algunas soluciones de la Wiki. | ||
| + | * Funciones que toman funciones. | ||
| + | * Casos mas complejos de recursiones con listas. | ||
| + | * Resolución de ejercicios. | ||
| + | * Anuncios varios. | ||
| ===== Algunas soluciones de la clase anterior ====== | ===== Algunas soluciones de la clase anterior ====== | ||
| Veamos algunas soluciones presentadas [[introalg: | Veamos algunas soluciones presentadas [[introalg: | ||
| + | |||
| + | |||
| + | * Función '' | ||
| + | * ¿Lista capicúa recursiva? | ||
| + | * Calificadores de **clase** ('' | ||
| + | * Pattern matching es más general de lo que vimos. | ||
| + | * La lista binaria '' | ||
| + | * Todos los programas se puede hacer en un par de lineas y si no usamos definiciones locales y/o otras funciones que //dividan el problema en partes// ([[http:// | ||
| + | | ||
| ===== Clase ===== | ===== Clase ===== | ||
| Línea 11: | Línea 25: | ||
| Veamos el ejercicio 18 | Veamos el ejercicio 18 | ||
| + | ----- | ||
| Defina la función //paraTodo: (A-> Bool)-> [A]-> Bool//, donde // | Defina la función //paraTodo: (A-> Bool)-> [A]-> Bool//, donde // | ||
| + | ----- | ||
| Nuevamente esta función es el típico caso que se resuelve con un caso base y un caso inductivo | Nuevamente esta función es el típico caso que se resuelve con un caso base y un caso inductivo | ||
| Línea 24: | Línea 40: | ||
| *Funciones de //alto orden//. | *Funciones de //alto orden//. | ||
| - | Esto es muy poderoso porque permite escribir programas funcionales que toman programas funcionales y generan otros programas funcionales. | + | Esto es muy poderoso porque permite escribir programas funcionales que toman programas funcionales y generan otros programas funcionales. |
| Las funciones son // | Las funciones son // | ||
| Línea 52: | Línea 68: | ||
| Con estos elementos y la función '' | Con estos elementos y la función '' | ||
| - | También podemos usar aplicación parcial en los operadores ('' | + | También podemos usar aplicación parcial en los operadores ('' |
| Por ejemplo ver que todos los elementos de una lista son 0 lo escribimos como | Por ejemplo ver que todos los elementos de una lista son 0 lo escribimos como | ||
| Línea 62: | Línea 78: | ||
| flip (==) 0 :: Num a => a -> Bool | flip (==) 0 :: Num a => a -> Bool | ||
| + | \\ | ||
| + | |||
| + | Veamos ahora una función que " | ||
| + | Por ejemplo: | ||
| + | |||
| + | Main> cierra [" | ||
| + | [(" | ||
| + | |||
| + | Esta función requiere inducción en dos listas al mismo tiempo, por lo tanto tenemos el //pattern matching// tendrá ahora **4 casos**. | ||
| + | |||
| + | * Caso(s) base(s) | ||
| + | * Caso(s) inductivo(s) | ||
| + | |||
| + | cierra :: [a] -> [a] -> [(a,a)] | ||
| + | cierra [] [] = [] | ||
| + | cierra (x:xs) [] = [] | ||
| + | cierra [] (y:ys) = [] | ||
| + | cierra (x:xs) (y:ys) = (x,y) : cierra xs ys | ||
| + | |||
| + | Entonces probemos: | ||
| + | |||
| + | Main> cierra [" | ||
| + | ERROR - Cannot infer instance | ||
| + | *** Instance | ||
| + | *** Expression : cierra [" | ||
| + | |||
| + | ¿Cuál es el problema? \\ | ||
| + | Tenemos un problema de tipos, el tipo de la función //no es lo suficientemente general//. \\ | ||
| + | Lo corregimos para que sea '' | ||
| + | |||
| + | Usando las ideas de este ejemplo podemos resolver los ejercicios 21 y 22 del práctico 8. | ||
| + | |||
| + | \\ | ||
| + | |||
| + | Generalicemos las funciones '' | ||
| + | |||
| + | duplicar :: [Int] -> [Int] | ||
| + | duplicar [] = [] | ||
| + | duplicar (x:xs) = x*2 : duplicar xs | ||
| + | |||
| + | multiplicar :: [Int] -> Int -> [Int] | ||
| + | multiplicar [] a = [] | ||
| + | multiplicar (x:xs) a = x*a : multiplicar xs a | ||
| + | |||
| + | La estructura es la misma, estamos aplicando una función a cada elemento de la lista.\\ | ||
| + | El ejercicio 24 dice: | ||
| + | |||
| + | ----- | ||
| + | a) Defina la función //mapear:(A -> B) -> [A] -> [B]// que dadas una función //f// y una lista //xs//, aplica //f// a cada elemento de la lista.\\ | ||
| + | Ejemplo: // | ||
| + | ----- | ||
| + | |||
| + | Tenemos nuevamente una **función de alto orden** y su definición es bien sencilla, con los dos casos (vacía y al menos un elemento) alcanza. | ||
| + | |||
| + | mapear :: (a->b) -> [a] -> [b] | ||
| + | mapear f [] = [] | ||
| + | mapear f (x:xs) = f x : mapear f xs | ||
| + | |||
| + | Ahora '' | ||
| + | |||
| + | Main> mapear (*2) [1,2,3] | ||
| + | [2,4,6] | ||
| + | |||
| + | Podemos definir '' | ||
| + | |||
| + | duplica' | ||
| + | |||
| + | Vemos como funciona haciendo los pasos de reducción de '' | ||
| + | |||
| + | * Gracias a la // | ||
| + | * Notación muy compacta y legible. | ||
| ===== Ejercicios ===== | ===== Ejercicios ===== | ||
| - | * (P8,E19) Usando '' | + | * (P8,E19) Usando '' |
| - | Pruebe con los siguientes primos: 7, 73, 739, 7393, 73939, 739391, 7393913, [[http:// | + | |
| * (P8,E21) Defina la función '' | * (P8,E21) Defina la función '' | ||
| - | * (P8, | + | * (P8, |
| + | * (P8,E24) Defina la la función '' | ||
| + | |||
| + | ===== Anuncios ===== | ||
| + | |||
| + | * La proxima clase (martes 23 de Mayo) habrá practica supervisada de taller. | ||
| + | * Vamos a evaluar el taller, como un parcialito más. | ||
introalg/taller3.1147739272.txt.gz · Última modificación: (editor externo)
