introalg:taller1
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
introalg:taller1 [2006/05/01 19:51] – created nicolasw | introalg:taller1 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Clase 1 ====== | ====== Clase 1 ====== | ||
- | * Introducción al uso de HUGS | ||
- | * Como escribir programas Haskell | ||
- | ---- | + | Plan para hoy |
- | [[http:// | + | * Introducción al uso de Hugs |
- | Durante este taller vamos a utilizarlo para escribir, probar y utilizar | + | * Cómo escribir |
+ | * Escribiendo | ||
+ | ===== Clase ===== | ||
+ | [[http:// | ||
+ | Durante este taller escribiremos, | ||
+ | |||
+ | A Hugs se lo invoca desde la //línea de comandos// o picando sobre el ícono en nuestro entorno gráfico. | ||
+ | Una vez que el intérprete está activo, la pantalla se presenta con un //prompt// a la espera de expresiones a ser evaluadas o comandos. | ||
+ | |||
+ | [nicolasw@azul Taller]$ hugs | ||
+ | __ __ __ __ ____ | ||
+ | || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard | ||
+ | ||___|| ||__|| ||__|| | ||
+ | ||---|| | ||
+ | || | ||
+ | || || Version: March 2005 | ||
+ | | ||
+ | Haskell 98 mode: Restart with command line option -98 to enable extensions | ||
+ | | ||
+ | Type :? for help | ||
+ | Hugs.Base> | ||
+ | |||
+ | De este modo Hugs se convierte en una calculadora, | ||
+ | Gracias al //preludio standard// tenemos muchas funciones ya definidas. | ||
+ | |||
+ | Hugs.Base> | ||
+ | 42 | ||
+ | Hugs.Base> | ||
+ | False | ||
+ | Hugs.Base> | ||
+ | [2, | ||
+ | Hugs.Base> | ||
+ | "daba le arroz al a zorra elabad" | ||
+ | |||
+ | Este ciclo continúa indefinidamente hasta que pidamos la salida del intérprete con CTRL-D o con el comando | ||
+ | |||
+ | Hugs.Base> | ||
+ | [Leaving Hugs] | ||
+ | [nicolasw@azul Taller]$ | ||
+ | |||
+ | |||
+ | |||
+ | Para poder dar nuevas definiciones y/o funciones necesitamos escribir un //programa funcional// o //script// Haskell. \\ | ||
+ | Un programa funcional es un [[http:// | ||
+ | |||
+ | 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 '': | ||
+ | Una posible solución para el problema de la función signo es la siguiente: | ||
+ | |||
+ | sgn :: Int -> Int | ||
+ | sgn x | 0< | ||
+ | | x< | ||
+ | | x=0 = 0 | ||
+ | |||
+ | Luego de salvar el programa y cargarlo, el intérprete indica un error pues '' | ||
+ | |||
+ | Hugs.Base> | ||
+ | Hugs.Base> | ||
+ | ERROR " | ||
+ | |||
+ | Las traducciones son más o menos directas, de todas formas preparamos una tabla de [[http:// | ||
+ | |||
+ | Volvemos a editar el script con '': | ||
+ | Podemos probar la nueva función para ganar confianza en su **corrección**. | ||
+ | |||
+ | Main> sgn 1 | ||
+ | 1 | ||
+ | Main> sgn 0 | ||
+ | 0 | ||
+ | Main> sgn -1 | ||
+ | ERROR - Cannot infer instance | ||
+ | *** Instance | ||
+ | *** Expression : sgn - 1 | ||
+ | | ||
+ | Main> sgn (-1) | ||
+ | -1 | ||
+ | Main> sgn 123123123123 | ||
+ | | ||
+ | Program error: arithmetic overflow | ||
+ | | ||
+ | Main> sgn 123123123 | ||
+ | 1 | ||
+ | Main> sgn 1.1 | ||
+ | ERROR - Cannot infer instance | ||
+ | *** Instance | ||
+ | *** Expression : sgn 1.1 | ||
+ | | ||
+ | Main> sgn (-1 | ||
+ | ERROR - Syntax error in expression (unexpected end of input) | ||
+ | | ||
+ | Main> map sgn [-10..10] | ||
+ | [-1, | ||
+ | |||
+ | Notamos los distintos tipos de errores que se producen por problemas de | ||
+ | * Precedencia | ||
+ | * Tipos | ||
+ | * 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, | ||
+ | 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:// | ||
+ | |||
+ | La regla completa para los años bisiestos según el calendario Gregoriano es: | ||
+ | Un año es bisiesto si es divisible por 4, excepto aquellos divisibles por 100 pero no por 400. | ||
+ | |||
+ | Entonces podemos seguir agregando definiciones de funciones a nuestro archivo '' | ||
+ | Veamos tres versiones distintas ((Esto es una mala copia de [[http:// | ||
+ | |||
+ | **La del viejo programadora/ | ||
+ | |||
+ | bisiesto'' | ||
+ | bisiesto'' | ||
+ | else if n `mod` 100 /= 0 then True | ||
+ | else if n `mod` 400 == 0 then True | ||
+ | else False | ||
+ | |||
+ | **El que está aprendiendo Haskell** | ||
+ | |||
+ | bisiesto' | ||
+ | bisiesto' | ||
+ | | n `mod` 4 == 0 = n `mod` 100 /= 0 || n `mod` 400 == 0 | ||
+ | |||
+ | **El que cursó [[http:// | ||
+ | |||
+ | bisiesto :: Int -> Bool | ||
+ | bisiesto n = n `mod` 4 == 0 && (n `mod` 100 /= 0 || n `mod` 400 == 0) | ||
+ | |||
+ | Podemos poner las tres versiones en nuestro script y probarlas rápidamente usando la función '' | ||
+ | |||
+ | Main> filter bisiesto [1945..2006] | ||
+ | [1948, | ||
+ | Main> filter bisiesto' | ||
+ | [1948, | ||
+ | Main> filter bisiesto'' | ||
+ | [1948, | ||
+ | |||
+ | 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 ===== | ||
+ | |||
+ | 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 | ||
+ | En un prisma rectangular, | ||
+ | la siguiente definición del área del prisma: \\ | ||
+ | // | ||
+ | //|[ | ||
+ | donde //frente//, //lado// y //arriba// son las caras frontal, lateral y superior del prisma respectivamente. | ||
introalg/taller1.1146513108.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)