introalg:taller3
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
introalg:taller3 [2006/05/15 12:43] – created, version inicial nicolasw | introalg:taller3 [2018/08/10 03:03] (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 ===== | ||
+ | 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. |
introalg/taller3.1147697014.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)