introalg:taller08_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:taller08_1 [2008/03/18 21:17] – laura | introalg:taller08_1 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 5: | Línea 5: | ||
===== Introducción al uso de Hugs===== | ===== Introducción al uso de Hugs===== | ||
- | [[http:// | + | [[http:// |
- | Durante este taller escribiremos, | + | |
+ | Durante este taller escribiremos, | ||
A Hugs se lo invoca desde la //línea de comandos// o picando sobre el icono en nuestro entorno gráfico. | A Hugs se lo invoca desde la //línea de comandos// o picando sobre el icono 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**. | 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 | + | [laura@azul Taller]$ hugs |
__ __ __ __ ____ | __ __ __ __ ____ | ||
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard | || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard | ||
Línea 24: | Línea 25: | ||
Hugs.Base> | Hugs.Base> | ||
- | De este modo Hugs se convierte en una calculadora, | + | De este modo Hugs se convierte en una calculadora, |
- | Gracias al [[http:// | + | |
+ | Gracias al [[http:// | ||
Hugs.Base> | Hugs.Base> | ||
Línea 38: | Línea 40: | ||
"daba le arroz al a zorra elabad" | "daba le arroz al a zorra elabad" | ||
- | Este ciclo continúa indefinidamente hasta que pidamos la salida | + | Podemos salir del intérprete |
Hugs.Base> | Hugs.Base> | ||
[Leaving Hugs] | [Leaving Hugs] | ||
- | [nicolasw@azul Taller]$ | + | [laura@azul Taller]$ |
+ | Así volvemos al modo normal de la computadora. | ||
- | Para poder dar nuevas definiciones y/o funciones necesitamos escribir un //programa funcional// o //script// Haskell. | + | Para poder dar nuevas definiciones y/o funciones, además de las que se encuentran en el [[http:// |
Un programa funcional es un [[http:// | Un programa funcional es un [[http:// | ||
- | A manera de ejemplo | + | Como ejemplo, vamos a ver todo el proceso |
+ | |||
+ | sgn :: Int → Int | ||
+ | -- dado un entero x, //sgn// retorna su signo, de la siguiente forma: | ||
+ | -- retornará 1 si x es positivo, -1 si es negativo y 0 en cualquier otro caso. | ||
+ | |||
+ | Para crear un //script// basta con invocar el comando para editar un (nuevo) archivo '': | ||
+ | |||
+ | Hugs.Base> | ||
- | 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 60: | Línea 71: | ||
- | Luego de salvar | + | Luego de guardar |
- | Hugs.Base> | ||
Hugs.Base> | Hugs.Base> | ||
ERROR " | ERROR " | ||
- | Las traducciones son más o menos directas, de todas formas preparamos una tabla de [[http:// | + | Pero el intérprete indica un error! Por qué? Porque " |
+ | |||
+ | Las traducciones | ||
+ | |||
+ | Para solucionar el error, volvemos a editar el script con '': | ||
+ | |||
+ | sgn :: Int -> Int | ||
+ | sgn x | 0< | ||
+ | | x< | ||
+ | | x==0 = 0 | ||
+ | |||
+ | |||
+ | Luego de guardar el programa, hay que **volver a cargarlo** para que el intérprete pueda usar la función corregida, si no lo cargamos, el intérprete se queda en el estado anterior, en el que no tenía la función porque ésta tenía un error. | ||
+ | |||
+ | Hugs.Base> | ||
+ | Main> | ||
+ | |||
+ | Ahora sí, la función es correcta y por ello el intérprete nos muestra el prompt '' | ||
- | 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 110: | Línea 136: | ||
* Precedencia ('' | * Precedencia ('' | ||
* Tipos ('' | * Tipos ('' | ||
- | * Sintáxis | + | * Sintaxis |
===== Inferencia de tipos ===== | ===== Inferencia de tipos ===== | ||
- | Hugs tiene una maquinaria para //inferir// tipos, tanto los declarados | + | Haskell es un lenguaje tipado, es decir, todos los datos pertenecen a una clase o tipo de datos. |
Main> :t sgn | Main> :t sgn | ||
Línea 144: | Línea 170: | ||
Esta maquinaria **impide** que escribamos cualquier expresión que esté mal tipada. | Esta maquinaria **impide** que escribamos cualquier expresión que esté mal tipada. | ||
+ | |||
+ | Todas las funciones suelen ir encabezadas por su signatura, es decir, el nombre de la función junto al tipo de sus parámetros y resultado. El nombre va seguido de ''::'' | ||
+ | |||
+ | sgn :: Int -> Int | ||
+ | reverse :: [a] -> [a] | ||
+ | map :: (a -> b) -> [a] -> [b] | ||
===== Tuplas ===== | ===== Tuplas ===== | ||
- | Haskell maneja n-uplas de manera directa. | + | Haskell maneja n-uplas de manera directa. |
Incorporamos a '' | Incorporamos a '' | ||
Línea 164: | Línea 197: | ||
(5,-1) | (5,-1) | ||
+ | Haskell también maneja listas de manera directa, pero lo veremos más adelante. | ||
Línea 169: | Línea 203: | ||
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, | 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 | + | La signatura 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:// | ||
Línea 221: | Línea 255: | ||
Para realizar en lo que resta de la clase. | Para realizar en lo que resta de la clase. | ||
- | * Definir la función //sumaRat (a,b) (c,d)//, //sumaRat : (Int,Int) -> (Int,Int) -> (Int,Int)// que suma dos números racionales.\\ No es necesario realizar ninguna simplificación al resultado. | + | * Definir la función //sumaRat (a,b) (c,d)//, //sumaRat : (Int,Int) -> (Int,Int) -> (Int,Int)// que suma dos números racionales. |
+ | |||
+ | No es necesario realizar ninguna simplificación al resultado. | ||
probar con (1,2) y (1,2), (1,4) y (1,4). | probar con (1,2) y (1,2), (1,4) y (1,4). |
introalg/taller08_1.1205875057.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)