introalg:taller07_5
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:taller07_5 [2007/05/28 16:19] – nicolasw | introalg:taller07_5 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 2: | Línea 2: | ||
En la clase anterior aprendimos cómo generalizar los programas que habíamos visto hasta el momento mediante dos estrategias básicas: generalización de tipos y generalización de funciones. Recordemos brevemente estas dos formas de generalización a través de un par de ejemplos. | En la clase anterior aprendimos cómo generalizar los programas que habíamos visto hasta el momento mediante dos estrategias básicas: generalización de tipos y generalización de funciones. Recordemos brevemente estas dos formas de generalización a través de un par de ejemplos. | ||
+ | |||
Línea 21: | Línea 22: | ||
</ | </ | ||
- | ? | + | ¿Cómo |
< | < | ||
Línea 32: | Línea 33: | ||
Las funciones que pueden tratar diferentes tipos se llaman **funciones polimórficas**. Cada //variable de tipo// puede denotar cualquier tipo, pero variables idénticas denotan tipos idénticos, y letras distintas pueden denotar el mismo tipo o tipos distintos. Por ejemplo, si " | Las funciones que pueden tratar diferentes tipos se llaman **funciones polimórficas**. Cada //variable de tipo// puede denotar cualquier tipo, pero variables idénticas denotan tipos idénticos, y letras distintas pueden denotar el mismo tipo o tipos distintos. Por ejemplo, si " | ||
- | Con '' | + | Con '' |
+ | |||
Línea 95: | Línea 98: | ||
foldr f z (x: | foldr f z (x: | ||
- | En el Preludio se usa, por ejemplo, para definir las funciones | + | En el Preludio se usa, por ejemplo, para definir las funciones |
concat | concat | ||
Línea 104: | Línea 107: | ||
or = foldr (||) False | or = foldr (||) False | ||
- | FIXME | + | |
- | ? | + | |
- | Y de paso practican lo del teórico! | + | |
+ | ==== Ejercicios ==== | ||
+ | |||
+ | * Utilizando aplicaciones, | ||
+ | * ¿Cuáles son el //paraTodo// y //existe// del preámbulo estandar? Revisar su definición. | ||
+ | |||
+ | |||
Línea 124: | Línea 134: | ||
Como 3 de los 4 casos de // | Como 3 de los 4 casos de // | ||
+ | abrochar' | ||
abrochar' | abrochar' | ||
abrochar' | abrochar' | ||
Línea 136: | Línea 147: | ||
Vemos que para esta función sólo hay que definir 3 casos porque el caso //nesimo 0 []// cae dentro del caso //nesimo _ []//. Vemos también que en el caso recursivo no se devuelve ningún resultado, sino que lo que se hace es recorrer la lista según va indicando el número, reduciendo el número en 1 cada vez que se recorre un elemento de la lista, hasta que se llega al punto indicado por el número, que se habrá convertido en 0, y ahí se devuelve el elemento correspondiente, | Vemos que para esta función sólo hay que definir 3 casos porque el caso //nesimo 0 []// cae dentro del caso //nesimo _ []//. Vemos también que en el caso recursivo no se devuelve ningún resultado, sino que lo que se hace es recorrer la lista según va indicando el número, reduciendo el número en 1 cada vez que se recorre un elemento de la lista, hasta que se llega al punto indicado por el número, que se habrá convertido en 0, y ahí se devuelve el elemento correspondiente, | ||
- | Veamos ahora una función un poco más compleja: // | + | Veamos ahora una función un poco más compleja: // |
- | + | ||
- | FIXME | + | |
- | No decir que son listas ordenadas. | + | |
encuentraEstafador :: [Int] -> [Int] -> [Int] | encuentraEstafador :: [Int] -> [Int] -> [Int] | ||
encuentraEstafador [] _ = [] | encuentraEstafador [] _ = [] | ||
- | encuentraEstafador (x:xs) ys | any (==x) ys = x : encuentraEstafador xs ys | + | encuentraEstafador (x:xs) ys | existe |
- | | otherwise | + | | otherwise |
- | La función //any// se encuentra en el preámbulo y tiene la siguiente definición: | + | Esta versión es poco eficiente porque para cada elemento de la primera lista tenemos que recorrer toda la segunda lista. Sin embargo, |
- | + | ||
- | any :: (a -> Bool) -> [a] -> Bool | + | |
- | any p = or . map p | + | |
- | + | ||
- | También podríamos usar la función //elem//, con la siguiente definición: | + | |
- | + | ||
- | elem :: Eq a => a -> [a] -> Bool | + | |
- | elem = any . (==) | + | |
- | + | ||
- | + | ||
- | Esta versión es poco eficiente porque para cada elemento de la primera lista tenemos que recorrer toda la segunda lista. Sin embargo, | + | |
- | + | ||
- | FIXME | + | |
- | Aca ejercicio de encuentraEstafador con listas ordenadas. | + | |
- | + | ||
- | Como se ve por la especificación de tipos de encuentraEstafador, | + | |
- | + | ||
- | FIXME | + | |
- | Pondría [(dni, | + | |
- | Les daría un caso concreto definiendo dos constantes listadoSubsidio y listadoMunicipales para que prueben | + | |
- | También metería un ejercicio que sea esto, usar encuentraEstafador a partir de fst,snd y map. | + | |
- | + | ||
- | fst :: (a,b) -> a | + | |
- | fst (x,_) = x | + | |
- | + | ||
- | snd :: (a,b) -> b | + | |
- | snd (_,y) = y | + | |
- | + | ||
- | + | ||
- | Ahora supongamos que estas listas no están ordenadas por DNI, sino por nombre. En ese caso, una vez obtuvimos la lista de DNIs, tenemos que ordenarlas para poder aplicar en algoritmo eficiente (encuentraEstafador' | + | |
- | + | ||
- | FIXME | + | |
- | No me metería con " | + | |
- | + | ||
- | Teniendo en cuenta todos estos añadidos, cómo podríamos componer una función encuentraEstafador' | + | |
- | + | ||
- | Vean que la función resultante puede quedar bien sencilla de leer justamente porque estamos usando otras funciones que hemos definido antes o que se encuentran definidas en el preludio. Nuestro objetivo para problemas complejos será identificar las subpartes de un problema que se pueden aislar y tratar en una función separada, a ser posible una función que ya haya sido definida y no tengamos que volver a definir. | + | |
- | + | ||
- | FIXME | + | |
- | Aca mostraría eficiencia con '': | + | |
+ | ====Ejercicios==== | ||
+ | * Definir //iguales :: Eq a => [a] -> [a] -> Bool// que decide si dos listas son iguales. | ||
+ | * Definir // | ||
+ | * Activar con '': | ||
+ | * Supongamos ahora que el listado de las personas que reciben subsidio por desempleo es una lista de tuplas // | ||
+ | < | ||
+ | listadoSubsidio :: [(Int, | ||
+ | listadoSubsidio = [(23763956," | ||
+ | listadoMuni :: [(String, | ||
+ | listadoMuni = [(" | ||
+ | </ | ||
Línea 212: | Línea 191: | ||
< | < | ||
-- extensión para poder leer archivos en Strings | -- extensión para poder leer archivos en Strings | ||
- | import IOExts | + | import |
-- constante principal con el grafo de la web. | -- constante principal con el grafo de la web. | ||
Línea 220: | Línea 199: | ||
-- carga un archivo en un String, usa IOExts | -- carga un archivo en un String, usa IOExts | ||
leeArchivo :: String -> String | leeArchivo :: String -> String | ||
- | leeArchivo nombre = unsafePerformIO$ readFile nombre | + | leeArchivo nombre = unsafePerformIO $ readFile nombre |
-- transforma el contenido del archivo de String a lista de tuplas | -- transforma el contenido del archivo de String a lista de tuplas | ||
Línea 228: | Línea 207: | ||
where | where | ||
fuente = takeWhile (not.esSeparador) xs | fuente = takeWhile (not.esSeparador) xs | ||
- | todoMenosFuente = drop 1 (dropWhile (not.esSeparador) xs) | + | todoMenosFuente = dropWhile esSeparador |
destino = takeWhile (not.esFinLinea) todoMenosFuente | destino = takeWhile (not.esFinLinea) todoMenosFuente | ||
- | resto = drop 1 (dropWhile (not.esFinLinea) todoMenosFuente) | + | resto = dropWhile esFinLinea |
esSeparador, | esSeparador, | ||
- | esSeparador x = x=='|' | + | esSeparador x = elem x "| " |
- | esFinLinea | + | esFinLinea |
</ | </ | ||
Línea 256: | Línea 235: | ||
Vamos a desarrollar diferentes funciones para obtener información de esta lista. | Vamos a desarrollar diferentes funciones para obtener información de esta lista. | ||
- | * Antes que nada necesitamos | + | * Determinar cuales y cuantas páginas se apuntan a si mismas. |
+ | * Para los siguientes puntos necesitaremos | ||
* //primeros :: [(a,b)] -> [a]// y //segundos :: [(a,b)] -> [b]// que le toman la primera y segunda coordenada a cada elemento de la lista de pares. Sirve para obtener todas las urls fuente y destino respectivamente. Ayuda: con '' | * //primeros :: [(a,b)] -> [a]// y //segundos :: [(a,b)] -> [b]// que le toman la primera y segunda coordenada a cada elemento de la lista de pares. Sirve para obtener todas las urls fuente y destino respectivamente. Ayuda: con '' | ||
* // | * // | ||
- | * Ahora queremos saber si un determinado url está en nuestro modelo simplificado y acotado de la web. La función que nos determina si un elemento está o no está en una lista es un acumulador, ya que parte de una lista y nos devuelve un valor (booleano), más en concreto el acumulador //elemento :: a -> [a] -> Bool//. En el preámbulo hay una función que devuelve True si un elemento dado está en una lista, cuál es? Si no la encontramos podemos definirla utilizando '' | + | * Ahora queremos saber si un determinado url está en nuestro modelo simplificado y acotado de la web. La función que nos determina si un elemento está o no está en una lista es un acumulador, ya que parte de una lista y nos devuelve un valor (booleano), más en concreto el acumulador //elemento :: Eq a => a -> [a] -> Bool//. En el preámbulo hay una función que devuelve True si un elemento dado está en una lista, cuál es? Si no la encontramos podemos definirla utilizando '' |
- | * ? | + | * ¿Cómo |
- | Utilizar esto junto a // | + | * ¿Cómo |
- | * ? | + | * ¿Cómo |
- | * ? | + | |
- | | + | |
- | FIXME : reescribir\\ | ||
Por último, de cara al futuro o a la próxima clase, podemos pensar cómo aplicaríamos estas funciones (que ahora aplicamos a una sola url) a todas las urls de la lista, recursivamente, | Por último, de cara al futuro o a la próxima clase, podemos pensar cómo aplicaríamos estas funciones (que ahora aplicamos a una sola url) a todas las urls de la lista, recursivamente, | ||
- | |||
- | ===== Ejercicios ===== | ||
- | |||
- | ==== Generalización ==== | ||
- | Generalizar las siguientes funciones usando las definiciones de aplicacion, filtro y acumular, aplicando generalización de tipos si es necesario: | ||
- | |||
- | === Aplicación === | ||
- | |||
- | * duplica | ||
- | * multiplica | ||
- | * veintePorCiento | ||
- | * nPorciento | ||
- | |||
- | === Filtro === | ||
- | |||
- | * empiezaM | ||
- | * solo0y1 | ||
- | * filtraNumeros | ||
- | |||
- | === Acumulación === | ||
- | |||
- | * sumatoria | ||
- | * productoria | ||
- | * factorial | ||
- | * contador | ||
- | * todos0y1 | ||
- | * paraTodo | ||
- | * existe | ||
- | |||
- | ==== Funciones mixtas ==== | ||
- | |||
- | * Definir la función //edadReal: [(String, | ||
- | |||
- | Ejemplo: edadReal [ (" | ||
- | |||
- | * Definir la función // | ||
- | |||
- | Ejemplo: escalaImpuesto [(" |
introalg/taller07_5.1180369151.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)