introalg:taller3
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previa | |||
| introalg:taller3 [2006/05/16 11:03] – nicolasw | introalg:taller3 [2025/11/15 13:47] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | ====== Clase 3 ====== | ||
| + | ===== 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 ====== | ||
| + | |||
| + | 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 ===== | ||
| + | |||
| + | Veamos el ejercicio 18 | ||
| + | |||
| + | ----- | ||
| + | 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 | ||
| + | |||
| + | paraTodo :: (a-> | ||
| + | paraTodo p [] = True | ||
| + | paraTodo p (x:xs) = p x && paraTodo p xs | ||
| + | |||
| + | Notemos que esta función toma como parámetro **una función**. | ||
| + | |||
| + | *Funciones que toman funciones. | ||
| + | *Funciones de //alto orden//. | ||
| + | |||
| + | Esto es muy poderoso porque permite escribir programas funcionales que toman programas funcionales y generan otros programas funcionales. \\ | ||
| + | Las funciones son // | ||
| + | |||
| + | Definimos rápidamente el predicado '' | ||
| + | |||
| + | noMultiplo :: Int -> Int -> Bool | ||
| + | noMultiplo p n = p `mod` n >0 | ||
| + | |||
| + | Notamos: | ||
| + | * Volvimos //infija// la función '' | ||
| + | * Usamos una versión [[http:// | ||
| + | |||
| + | Podríamos haber escrito | ||
| + | |||
| + | noMultiplo' | ||
| + | noMultiplo' | ||
| + | |||
| + | Sin embargo son diferentes pues '' | ||
| + | |||
| + | Main> :t noMultiplo | ||
| + | noMultiplo :: Int -> Int -> Bool | ||
| + | Main> :t noMultiplo 20 | ||
| + | noMultiplo 21 :: Int -> Bool | ||
| + | Main> :t noMultiplo 21 2 | ||
| + | noMultiplo 21 2 :: Bool | ||
| + | |||
| + | Con estos elementos y la función '' | ||
| + | |||
| + | 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 | ||
| + | |||
| + | Main> paraTodo (==0) [0,0,0,0,0] | ||
| + | True | ||
| + | Main> paraTodo (==0) (desdeHasta 0 20) | ||
| + | False | ||
| + | Main> :t (==0) | ||
| + | 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 ===== | ||
| + | * (P8,E19) Usando '' | ||
| + | * (P8,E21) Defina la función '' | ||
| + | * (P8,E24) Defina la función '' | ||
| + | * (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. | ||
