introalg:taller07_2
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_2 [2007/04/17 15:24] – nicolasw | introalg:taller07_2 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 38: | Línea 38: | ||
tercero3 (_,_,z) = z | tercero3 (_,_,z) = z | ||
</ | </ | ||
+ | |||
==== Numéricos ==== | ==== Numéricos ==== | ||
Línea 66: | Línea 67: | ||
</ | </ | ||
+ | Un ejemplo típico que ejercita los patrones numéricos es la [[http:// | ||
+ | < | ||
+ | fib :: Int -> Int | ||
+ | fib 0 = 1 | ||
+ | fib 1 = 1 | ||
+ | fib (n+2) = fib (n+1) + fib n | ||
+ | </ | ||
Línea 95: | Línea 103: | ||
Veamos que tenemos más posibilidades que cabeza y cola. | Veamos que tenemos más posibilidades que cabeza y cola. | ||
- | Definimos un predicado que decide si hay 2 o mas elementos en una lista y damos dos versiones una bastante | + | Definimos un predicado que decide si //hay 2 o más elementos en una lista// y damos dos versiones una bastante |
< | < | ||
Línea 114: | Línea 122: | ||
Main> map alMenos2' | Main> map alMenos2' | ||
[False, | [False, | ||
+ | |||
Línea 147: | Línea 156: | ||
| | ||
Program error: No hay cabeza | Program error: No hay cabeza | ||
+ | | ||
Main> ordenaCabeza (take 10 (repeat (2,1))) | Main> ordenaCabeza (take 10 (repeat (2,1))) | ||
(1,2) | (1,2) | ||
+ | |||
+ | |||
===== Dividiendo el problema en partes ===== | ===== Dividiendo el problema en partes ===== | ||
Línea 186: | Línea 197: | ||
</ | </ | ||
- | 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 | + | Siempre es conveniente ser desconfiado y probamos que ambas funciones sean iguales en el rango // |
+ | |||
+ | Main> filter pip [0..9999] == filter pip' [0..9999] | ||
+ | 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, | ||
+ | |||
+ | |||
+ | |||
==== Otro ejemplo ==== | ==== Otro ejemplo ==== | ||
Línea 195: | Línea 235: | ||
< | < | ||
- | descuento :: (Int,Bool) -> (Float,Int,Float) | + | descuento :: (Float,Bool) -> (Float,Float,Float) |
- | -- argumento: | + | -- argumento: |
- | -- resultado: una tresupla (Float,Int,Float) que representa el monto total, | + | -- resultado: una tresupla (Float,Float,Float) que representa el monto total, |
-- restando el descuento correspondiente, | -- restando el descuento correspondiente, | ||
-- y el descuento en tickets, respectivamente. | -- y el descuento en tickets, respectivamente. | ||
- | descuento x y | x == 257 && y == True = ( x - 0.2*x , 10*x, 0.1*x) | + | descuento |
- | | x == 257 && y == False = ( x - 0.2*x , 10*x, 0) | + | | x == 257 && |
- | | x == 350 && y == True = ( x - 0.2*x , 10*x, 0.1*x) | + | | x == 350 && y |
- | | x == 350 && y == False = ( x - 0.2*x , 10*x, 0) | + | | x == 350 && |
- | | x == 489 && y == True = ( x - 0.2*x , 10*x, 0.1*x) | + | | x == 489 && y |
- | | x == 489 && y == False = ( x - 0.2*x , 10*x, 0) | + | | x == 489 && |
- | | x > 1000 && y == True = ( x - 0.2*x , 10*x, 0.1*x) | + | | x > 1000 && y |
- | | x > 1000 && y == False = ( x - 0.2*x , 10*x, 0) | + | | x > 1000 && |
- | | x == 768 && y == True = ( x - 0.2*x , 10*x, 0.1*x) | + | | x == 768 && y |
- | | x == 768 && y == False = ( x - 0.2*x , 10*x, 0) | + | | x == 768 && |
- | | x == 999 && y == True = ( x - 0.2*x , 10*x, 0.1*x) | + | | x == 999 && y |
- | | x == 573 && y == False = ( x - 0.2*x , 10*x, 0) | + | | x == 573 && |
- | | x > 500 && x <= 1000 && y == True = ( x - 0.15*x , 5*x, 0.05*x) | + | | x > 500 && x <= 1000 && y = ( x - 0.15*x , 5*x, 0.05*x) |
- | | x > 500 && x <= 1000 && y == False = ( x - 0.15*x , 5*x, 0) | + | | x > 500 && x <= 1000 && |
- | | x > 200 && x <= 500 && y == True = ( x - 0.1*x , 2*x, 0.02*x) | + | | x > 200 && x <= 500 && y = ( x - 0.1*x , 2*x, 0.02*x) |
- | | x > 200 && x <= 500 && y == False = ( x - 0.1*x , 2*x, 0) | + | | x > 200 && x <= 500 && |
- | | x <= 200 = ( x , x , 0 ) | + | | x <= 200 = ( x , x , 0) |
</ | </ | ||
Línea 223: | Línea 263: | ||
< | < | ||
- | descuento :: (Int,Bool) -> (Float,Int,Float) | + | descuento' |
- | descuento (x,y) | x == 257 || x == 350 || x == 489 || x == 768 || x == 999 || x == 573 = descuento20 (x,y) | + | descuento' |
- | | x > 1000 = descuento20 (x,y) | + | |
- | | x > 500 && x <= 1000 = descuento15 (x,y) | + | |
- | | x > 200 && x <= 500 = descuento10 (x,y) | + | |
- | | x <= 200 = descuento0 (x,y) | + | |
- | descuento20 :: (Int,Bool) -> (Float,Int,Float) | + | descuento20 :: (Float,Bool) -> (Float,Float,Float) |
descuento20 (x,y) | y == True = ( x - 0.2*x , 10*x, 0.1*x) | descuento20 (x,y) | y == True = ( x - 0.2*x , 10*x, 0.1*x) | ||
| y == False = ( x - 0.2*x , 10*x, 0) | | y == False = ( x - 0.2*x , 10*x, 0) | ||
- | descuento15 :: (Int,Bool) -> (Float,Int,Float) | + | descuento15 :: (Float,Bool) -> (Float,Float,Float) |
descuento15 (x,y) | y == True = ( x - 0.15*x , 5*x, 0.05*x) | descuento15 (x,y) | y == True = ( x - 0.15*x , 5*x, 0.05*x) | ||
| y == False = ( x - 0.15*x , 5*x, 0) | | y == False = ( x - 0.15*x , 5*x, 0) | ||
- | descuento10 :: (Int,Bool) -> (Float,Int,Float) | + | descuento10 :: (Float,Bool) -> (Float,Float,Float) |
descuento10 (x,y) | y == True = ( x - 0.1*x , 2*x, 0.02*x) | descuento10 (x,y) | y == True = ( x - 0.1*x , 2*x, 0.02*x) | ||
| y == False = ( x - 0.1*x , 2*x, 0) | | y == False = ( x - 0.1*x , 2*x, 0) | ||
- | descuento0 :: (Int,Bool) -> (Float,Int,Float) | + | descuento0 :: (Float,Bool) -> (Float,Float,Float) |
- | descuento0 (x,y) = ( x , x , 0 ) | + | descuento0 (x,y) = ( x , x , 0) |
</ | </ | ||
- | ==== Algo un poco más ordenado ==== | + | |
===== Estilo de Código (coding style) ===== | ===== Estilo de Código (coding style) ===== | ||
+ | |||
+ | |||
+ | |||
+ | |||
==== Reglas de sangrado (layout) (distribución) ==== | ==== Reglas de sangrado (layout) (distribución) ==== | ||
Línea 262: | Línea 307: | ||
* el código que forma parte de una expresión (o bloque) tiene que indentarse más adentro que la línea que contiene el principio de esa expresión. | * el código que forma parte de una expresión (o bloque) tiene que indentarse más adentro que la línea que contiene el principio de esa expresión. | ||
- | Por ejemplo, cuando usamos una lista de instrucciones de la misma clase dentro de una función, deben estar todas indentadas a la misma altura, como si estuvierna | + | Por ejemplo, cuando usamos una lista de instrucciones de la misma clase dentro de una función, deben estar todas indentadas a la misma altura, como si estuvieran |
- | area.a.b.c = 2*frente + 2*lado + 2*tapa | + | area a b c = 2*frente + 2*lado + 2*tapa |
where | where | ||
frente = a*b | frente = a*b | ||
Línea 273: | Línea 318: | ||
PREGUNTA: ¿Cómo podemos escribir esta función usando puntuación en lugar de indentación? | PREGUNTA: ¿Cómo podemos escribir esta función usando puntuación en lugar de indentación? | ||
- | Esto estaría mal si lo escribiéramos de la siguiente forma: | + | Esto sigue siendo válido |
- | area.a.b.c = 2*frente + 2*lado + 2*tapa | + | area a b c = 2*frente + 2*lado + 2*tapa |
where | where | ||
| | ||
Línea 281: | Línea 326: | ||
tapa = a*c | tapa = a*c | ||
- | Y también si lo escribiéramos así: | + | Pero no cuando las // |
- | area.a.b.c = 2*frente + 2*lado + 2*tapa | + | area a b c = 2*frente + 2*lado + 2*tapa |
where | where | ||
- | | + | |
- | lado = b*c | + | lado = b*c |
- | tapa = a*c | + | tapa = a*c |
+ | |||
+ | Simplemente no sabe que el '' | ||
+ | |||
+ | Main> :e | ||
+ | ERROR " | ||
Para ver más ejemplos, vayan al [[http:// | Para ver más ejemplos, vayan al [[http:// | ||
Línea 293: | Línea 344: | ||
Para saber más, vean la [[http:// | Para saber más, vean la [[http:// | ||
- | Y ya que estamos, sepan que toda línea que comienza por dos guiones (o signos " | + | Y ya que estamos, sepan que toda **línea** que comienza por dos guiones (o signos " |
+ | Y para evitar que se interpreten **bloques completos**, | ||
+ | |||
+ | < | ||
+ | -- Nada de esto se toma | ||
+ | {- Y esto | ||
+ | | ||
+ | -} | ||
+ | </ | ||
==== Case sensitiveness (sensibilidad a la caja) ==== | ==== Case sensitiveness (sensibilidad a la caja) ==== | ||
Línea 304: | Línea 364: | ||
* los nombres de **funciones y variables** comienzan con **minúscula** | * los nombres de **funciones y variables** comienzan con **minúscula** | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Nombres de variables ==== | ||
+ | |||
+ | En general se intenta que el código sea auto explicativo, | ||
+ | Algo que resulta muy sencillo y útil es dar nombres significativos a las variables. | ||
+ | Podríamos haber escrito la función área de la siguiente manera. | ||
+ | |||
+ | area a1 a2 a3 = 2*a4 + 2*a5 + 2*a6 | ||
+ | where | ||
+ | a4 = a1*a2 | ||
+ | a5 = a2*a3 | ||
+ | a6 = a1*a3 | ||
+ | |||
+ | o bien de manera equivalente e igualmente eficiente, pero mucho más comprensible: | ||
+ | |||
+ | area b a p = 2*frente + 2*lado + 2*tapa | ||
+ | where | ||
+ | frente = b * a | ||
+ | lado = p * a | ||
+ | tapa = b * p | ||
+ | |||
===== Ejercicios ===== | ===== Ejercicios ===== | ||
Línea 316: | Línea 400: | ||
probar con [1,2,3], con [3,3,3] y con []. | probar con [1,2,3], con [3,3,3] y con []. | ||
- | * Definir una función // | + | * Definir una función // |
probar con [1,2,3], con [3,3,3], con [0], con [0,1] y con []. | probar con [1,2,3], con [3,3,3], con [0], con [0,1] y con []. | ||
- | * Definir una función //segundoEssegundo.(x, | + | * Definir una función //segundoEsSegundo.(x, |
probar con (1,2) y [3,2,4,5], (0,0) y [], (1,2) y [2,3,4,5]. | probar con (1,2) y [3,2,4,5], (0,0) y [], (1,2) y [2,3,4,5]. | ||
- | * Definir una función // | + | * Definir una función // |
Ayuda: fíjense que el resultado siempre debe ser una lista de caracteres! | Ayuda: fíjense que el resultado siempre debe ser una lista de caracteres! | ||
introalg/taller07_2.1176823458.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)