introalg:taller07_1
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_1 [2007/04/10 14:13] – nicolasw | introalg:taller07_1 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Clase 1 ====== | ====== Clase 1 ====== | ||
- | Plan para hoy | ||
- | * Introducción al uso de Hugs | ||
- | * Cómo escribir programas Haskell | ||
- | * Escribiendo los primeros programas | ||
- | * Análisis por casos | ||
- | * Manejo de tuplas | ||
- | + | ===== Introducción al uso de Hugs===== | |
- | ===== Clase ===== | + | |
[[http:// | [[http:// | ||
Línea 58: | Línea 51: | ||
A manera de ejemplo realicemos un ciclo de **creación-carga-prueba-modificación-recarga**, | A manera de ejemplo realicemos un ciclo de **creación-carga-prueba-modificación-recarga**, | ||
- | Para crear un //script// basta con invocar el comando para editar un (nuevo) archivo '': | + | Para crear un //script// basta con invocar el comando para editar un (nuevo) archivo '': |
Una posible solución para el problema de la función signo es la siguiente: | Una posible solución para el problema de la función signo es la siguiente: | ||
Línea 69: | Línea 62: | ||
Luego de salvar el programa y cargarlo, el intérprete indica un error pues '' | Luego de salvar el programa y cargarlo, el intérprete indica un error pues '' | ||
- | Hugs.Base> | + | Hugs.Base> |
- | Hugs.Base> | + | Hugs.Base> |
- | ERROR "ejercicios8.hs":4 - Syntax error in input (unexpected `=') | + | ERROR "cap8.hs":4 - Syntax error in input (unexpected `=') |
Las traducciones son más o menos directas, de todas formas preparamos una tabla de [[http:// | Las traducciones son más o menos directas, de todas formas preparamos una tabla de [[http:// | ||
- | Volvemos a editar el script con '': | + | Volvemos a editar el script con '': |
Podemos probar la nueva función con //casos de test// para ganar confianza en su **corrección**. | Podemos probar la nueva función con //casos de test// para ganar confianza en su **corrección**. | ||
Línea 102: | Línea 95: | ||
Main> sgn (-1 | Main> sgn (-1 | ||
ERROR - Syntax error in expression (unexpected end of input) | ERROR - Syntax error in expression (unexpected end of input) | ||
+ | | ||
Main> sgn " | Main> sgn " | ||
ERROR - Type error in application | ERROR - Type error in application | ||
Línea 112: | Línea 105: | ||
Main> map sgn [-10..10] | Main> map sgn [-10..10] | ||
[-1, | [-1, | ||
+ | |||
Notamos los distintos tipos de errores que se producen por problemas de | Notamos los distintos tipos de errores que se producen por problemas de | ||
Línea 118: | Línea 112: | ||
* Sintáxis ('' | * Sintáxis ('' | ||
- | A manera de ejemplo veamos el ejercicio 8.7, donde tenemos que definir una función muy útil para cualquier aparato que maneje un calendario (relojes, celulares, PDAs, computadoras, | + | |
+ | ===== Inferencia de tipos ===== | ||
+ | |||
+ | Hugs tiene una maquinaria para //inferir// tipos, tanto los declarados | ||
+ | |||
+ | Main> :t sgn | ||
+ | sgn :: Int -> Int | ||
+ | |||
+ | Como expresiones en general | ||
+ | |||
+ | Main> :t 1 + 2.1 | ||
+ | 1 + 2.1 :: Fractional a => a | ||
+ | |||
+ | Main> :t 1+ sqrt 64 | ||
+ | 1 + sqrt 64 :: Floating a => a | ||
+ | |||
+ | Main> :t 1+ " | ||
+ | ERROR - Cannot infer instance | ||
+ | *** Instance | ||
+ | *** Expression : 1 + " | ||
+ | |||
+ | Main> :t " | ||
+ | " | ||
+ | |||
+ | Main> :t reverse | ||
+ | reverse :: [a] -> [a] | ||
+ | |||
+ | Main> :t map | ||
+ | map :: (a -> b) -> [a] -> [b] | ||
+ | |||
+ | |||
+ | Esta maquinaria **impide** que escribamos cualquier expresión que esté mal tipada. | ||
+ | |||
+ | |||
+ | ===== Tuplas ===== | ||
+ | |||
+ | Haskell maneja n-uplas de manera directa. | ||
+ | Incorporamos a '' | ||
+ | |||
+ | suma3upla :: (Int, | ||
+ | suma3upla (x,y,z) = x+y+z | ||
+ | |||
+ | sumaYResta :: Int -> Int -> (Int,Int) | ||
+ | sumaYResta x y = (x+y, x-y) | ||
+ | |||
+ | Y las probamos desde el // | ||
+ | |||
+ | Main> suma3upla (2,3,4) | ||
+ | 9 | ||
+ | Main> sumaYResta 2 3 | ||
+ | (5,-1) | ||
+ | |||
+ | |||
+ | |||
+ | ===== Ejemplo: la función bisiesto ===== | ||
+ | |||
+ | A manera de ejemplo veamos el ejercicio 8.7 del apunte, donde tenemos que definir una función muy útil para cualquier aparato que maneje un calendario (relojes, celulares, PDAs, computadoras, | ||
La signatura ((Signatura es el nombre de la función junto al tipo de sus parámetros y resultado)) es //bisiesto: Int -> Bool//, y es un predicado que devuelve //true// si el año es bisiesto y //false// en caso contrario. | La signatura ((Signatura es el nombre de la función junto al tipo de sus parámetros y resultado)) es //bisiesto: Int -> Bool//, y es un predicado que devuelve //true// si el año es bisiesto y //false// en caso contrario. | ||
Recordemos cuando un año es [[http:// | Recordemos cuando un año es [[http:// | ||
- | La regla completa | + | La regla para los años bisiestos según el calendario |
- | Un año es bisiesto si es divisible por 4, excepto aquellos divisibles por 100 pero no por 400. | + | Un año es bisiesto si es divisible por 4, excepto |
+ | que para ser bisiestos, también deben ser divisibles | ||
+ | |||
+ | Una definición matemática concisa sería //bisiesto n = 4|n /\ (100|n => 400|n)//. | ||
- | Entonces podemos seguir agregando definiciones de funciones a nuestro archivo '' | + | Entonces podemos seguir agregando definiciones de funciones a nuestro archivo '' |
Veamos tres versiones distintas ((Esto es una mala copia de [[http:// | Veamos tres versiones distintas ((Esto es una mala copia de [[http:// | ||
Línea 157: | Línea 210: | ||
Vemos que las tres funciones operan correctamente en el rango de números dados ((No queremos decir que sean correctas en su totalidad, solo decimos que en ese rango no tienen fallas)). | Vemos que las tres funciones operan correctamente en el rango de números dados ((No queremos decir que sean correctas en su totalidad, solo decimos que en ese rango no tienen fallas)). | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
===== Ejercicios ===== | ===== Ejercicios ===== | ||
Línea 162: | Línea 221: | ||
Para realizar en lo que resta de la clase. | Para realizar en lo que resta de la clase. | ||
- | * Ejercicio 8.7 | + | |
- | Definir la función //edad : (Nat, Nat, Nat) -> (Nat, Nat, Nat) -> Int// que dadas dos fechas indica los años transcurridos entre ellas. Por ejemplo edad.(20, | + | |
- | * Ejercicio 8.8 | + | probar con (1,2) y (1,2), (1,4) y (1,4). |
+ | |||
+ | |||
+ | * Definir una función // | ||
+ | |||
+ | probar con (0,1), (2,2), (3,1). | ||
+ | |||
+ | * Definir una función // | ||
+ | |||
+ | probar con 5 y 9, con -8 y 9, con -10 y -1, con 0 y 0 y con 0 y 3 | ||
+ | |||
+ | | ||
+ | Definir la función //edad : (Int, Int, Int) -> (Int, Int, Int) -> Int// que dadas dos fechas indica los años transcurridos entre ellas. Por ejemplo edad.(20, | ||
+ | Suponer que las fechas están siempre bien formadas y que la primera es menor o igual a la segunda. | ||
+ | |||
+ | probar con (16,4,1980) y (17, | ||
+ | |||
+ | |||
+ | * Ejercicio 8.8 del Apunte.\\ | ||
En un prisma rectangular, | En un prisma rectangular, | ||
la siguiente definición del área del prisma: \\ | la siguiente definición del área del prisma: \\ | ||
// | // | ||
//|[ | //|[ | ||
- | donde //frente//, //lado// y //arriba// son las caras frontal, lateral y superior del prisma respectivamente. | + | donde //frente//, //lado// y //arriba// son las caras frontal, lateral y superior del prisma respectivamente.\\ |
+ | |||
+ | Completar la función // | ||
+ | area :: Int -> Int -> Int -> Int | ||
+ | area.h.b.d = 2*frente + 2*lado + 2*tapa | ||
+ | where | ||
+ | frente = ... | ||
+ | lado = ... | ||
+ | tapa = ... |
introalg/taller07_1.1176214427.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)