introalg:taller09_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:taller09_4 [2009/04/20 04:05] – laura | introalg:taller09_4 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 24: | Línea 24: | ||
====Patrones==== | ====Patrones==== | ||
- | Vimos también que en haskell se puede expresar muy naturalmente la definición de una función mediante análisis por casos. Estos casos son lo que en haskell se conoce como // | + | Vimos también que en haskell se puede expresar muy naturalmente la definición de una función mediante análisis por casos. Estos casos son lo que en haskell se conoce como // |
< | < | ||
nombreFunción arg1 arg2 arg3 | patron1 = resultado1 | nombreFunción arg1 arg2 arg3 | patron1 = resultado1 | ||
Línea 38: | Línea 38: | ||
</ | </ | ||
- | Para resolver una expresión, el intérprete de haskell funciona de forma muy parecida al de prolog: dada una expresión, el intérprete busca una definición de función con la que pueda unificar, de la misma forma que el intérprete de prolog buscaba una regla con cuya cabeza pudiera unificar la expresión. Luego, si esta definición tiene patrones, el intérprete se fija si esos patrones evalúan a '' | + | Para resolver una expresión, el intérprete de haskell funciona de forma muy parecida al de prolog: dada una expresión, el intérprete busca una definición de función con la que pueda unificar, de la misma forma que el intérprete de prolog buscaba una regla con cuya cabeza pudiera unificar la expresión. Luego, si esta definición tiene patrones, el intérprete se fija si esos patrones evalúan a '' |
Veamos algunos ejemplos de definición de funciones mediante análisis por casos en patrones, y luego veamos cómo funcionan los mecanismos de unificación. | Veamos algunos ejemplos de definición de funciones mediante análisis por casos en patrones, y luego veamos cómo funcionan los mecanismos de unificación. | ||
Línea 51: | Línea 51: | ||
Veamos que hemos hecho una sola definición para la función, en la que hemos asignado nombres de variables a su argumento, llamando '' | Veamos que hemos hecho una sola definición para la función, en la que hemos asignado nombres de variables a su argumento, llamando '' | ||
- | Dada una expresión como '' | + | Dada una expresión como '' |
- | Fíjense que habría otras formas de definir la función, más legibles, más cortas y más eficientes, ya que algunos casos se evaluarían a '' | + | Fíjense que habría otras formas de definir la función, más legibles, más cortas y más eficientes, ya que algunos casos se evaluarían a '' |
< | < | ||
ordena' | ordena' | ||
ordena' | ordena' | ||
- | | x >= y = (y,x) | + | | x > y = (y,x) |
</ | </ | ||
- | Efectivamente, | + | Efectivamente, |
- | La función '' | + | La función '' |
< | < | ||
ambospositivos :: Int -> Int -> Bool | ambospositivos :: Int -> Int -> Bool | ||
- | ambospositivos x y | x >= 0 && y >= 0 = true | + | ambospositivos x y | x >= 0 && y >= 0 = True |
- | | x >= 0 && y < 0 = false | + | | x >= 0 && y < 0 = False |
- | | x < 0 && y >= 0 = false | + | | x < 0 && y >= 0 = False |
- | | x < 0 && y < 0 | + | | x < 0 && y < 0 |
</ | </ | ||
Si nos fijamos un poco, vemos que los tres últimos patrones se pueden colapsar en uno solo, usando un " | Si nos fijamos un poco, vemos que los tres últimos patrones se pueden colapsar en uno solo, usando un " | ||
< | < | ||
ambospositivos' | ambospositivos' | ||
- | ambospositivos' | + | ambospositivos' |
- | | x >= 0 || y < 0 = false | + | | x >= 0 || y < 0 = False |
</ | </ | ||
- | Pero además, vemos que también podemos expresar lo mismo de otra forma: que nos devuelva '' | + | Pero además, vemos que también podemos expresar lo mismo de otra forma: que nos devuelva '' |
< | < | ||
ambospositivos'' | ambospositivos'' | ||
- | ambospositivos'' | + | ambospositivos'' |
- | | otherwise | + | | otherwise |
</ | </ | ||
- | Pero si reflexionamos bien bien sobre el asunto, nos damos cuenta de que en realidad, si el resultado que buscamos es un booleano, ya lo teníamos, delante de nuestros ojos: el primer patrón es un booleano que evalúa a '' | + | Pero si reflexionamos bien bien sobre el asunto, nos damos cuenta de que en realidad, si el resultado que buscamos es un booleano, ya lo teníamos, delante de nuestros ojos: el primer patrón es un booleano que evalúa a '' |
< | < | ||
ambospositivos''' | ambospositivos''' | ||
Línea 90: | Línea 90: | ||
< | < | ||
edad :: (Int, Int, Int) -> (Int, Int, Int) -> Int | edad :: (Int, Int, Int) -> (Int, Int, Int) -> Int | ||
- | edad (diaN, | + | edad (diaN, |
- | | otherwise | + | | otherwise |
</ | </ | ||
Línea 139: | Línea 139: | ||
< | < | ||
edad' :: (Int, Int, Int) -> (Int, Int, Int) -> Int | edad' :: (Int, Int, Int) -> (Int, Int, Int) -> Int | ||
- | edad' (diaN, | + | edad' (diaN, |
- | | compruebaParametros (diaN, | + | | compruebaParametros (diaN, |
</ | </ | ||
Podemos usar nombres más cortos para que quede toda la función dentro de una línea, pero entonces nos resultará más difícil recordar qué representa cada variable o función: | Podemos usar nombres más cortos para que quede toda la función dentro de una línea, pero entonces nos resultará más difícil recordar qué representa cada variable o función: | ||
< | < | ||
e :: (Int, Int, Int) -> (Int, Int, Int) -> Int | e :: (Int, Int, Int) -> (Int, Int, Int) -> Int | ||
- | e (d,m,a) (f,n,b) | c (d,m,a) (f,n,b) && m <= n && d < f | + | e (d,m,a) (f,n,b) | c (d,m,a) (f,n,b) && |
- | | c (d,m,a) (f, | + | | c (d,m,a) (f, |
</ | </ | ||
Línea 158: | Línea 158: | ||
< | < | ||
compruebaParametros' | compruebaParametros' | ||
- | compruebaParametros' | + | compruebaParametros' |
- | | mesN == 2 = diaN > 0 && diaN <= 28 && diaA > 0 && diaA <= 31 && mesA > 0 && mesA <= 12 && anioN <= anioA = true | + | | mesN == 2 = diaN > 0 && diaN <= 28 && diaA > 0 && diaA <= 31 && mesA > 0 && mesA <= 12 && anioN <= anioA = True |
- | | mesA == 2 = diaN > 0 && diaN <= 31 && diaA > 0 && diaA <= 28 && mesN > 0 && mesN <= 12 && anioN <= anioA = true | + | | mesA == 2 = diaN > 0 && diaN <= 31 && diaA > 0 && diaA <= 28 && mesN > 0 && mesN <= 12 && anioN <= anioA = True |
- | | otherwise | + | | otherwise |
</ | </ | ||
Línea 176: | Línea 176: | ||
compruebaAnterior :: (Int, Int, Int) -> (Int, Int, Int) -> Bool | compruebaAnterior :: (Int, Int, Int) -> (Int, Int, Int) -> Bool | ||
compruebaAnterior (diaN, | compruebaAnterior (diaN, | ||
- | | anioA > anioN = true | + | | anioA > anioN = True |
- | | otherwise | + | | otherwise |
</ | </ | ||
Línea 242: | Línea 242: | ||
==== ej.3: '' | ==== ej.3: '' | ||
- | Tomemos como ejemplo la función | + | Tomemos como ejemplo la función |
| | ||
Suponer el siguiente juego: m jugadores en ronda comienzan a decir los números naturales consecutivamente. | Suponer el siguiente juego: m jugadores en ronda comienzan a decir los números naturales consecutivamente. | ||
Cuando toca un multiplo de 7 o un número con algún dígito igual a 7, el jugador debe decir pip en lugar del número. | Cuando toca un multiplo de 7 o un número con algún dígito igual a 7, el jugador debe decir pip en lugar del número. | ||
- | Se pide: encontrar un predicado | + | Se pide: encontrar un predicado |
- | Con un complicado juego de //mod// y //div// podemos llegar a una solución: | + | Con un complicado juego de '' |
< | < | ||
Línea 277: | Línea 277: | ||
True | True | ||
- | Y hasta podemos generalizar las funciones //unidad, decena, etc.// en una que nos dé el dígito n-ésimo de la representación decimal, pero para eso necesitamos usar **funciones recursivas**.\\ | ||
- | Eso será tema de la próxima clase, pero veamos de todas maneras la " | ||
- | |||
- | < | ||
- | digitos :: Int -> [Int] | ||
- | digitos 0 = [] | ||
- | digitos n = n `mod` 10 : (digitos (n `div` 10)) | ||
- | </ | ||
- | |||
- | La probamos para ver como opera | ||
- | |||
- | Main> digitos 0 | ||
- | [] | ||
- | Main> digitos 1 | ||
- | [1] | ||
- | Main> digitos 10 | ||
- | [0,1] | ||
- | Main> digitos 120 | ||
- | [0,2,1] | ||
- | Main> digitos 123123123 | ||
- | [3, | ||
=====Definiciones locales===== | =====Definiciones locales===== | ||
Línea 332: | Línea 311: | ||
Si no lo hicieron el día anterior, traten de resolver los siguientes problemas: | Si no lo hicieron el día anterior, traten de resolver los siguientes problemas: | ||
- | - // | + | - '' |
- | - // | + | - '' |
- | - // | + | - '' |
- | - Definan, según su propio criterio para otorgar becas, la función | + | - Definan, según su propio criterio para otorgar becas, la función |
Nuevos problemas: | Nuevos problemas: |
introalg/taller09_4.1240200354.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)