Herramientas de usuario

Herramientas del sitio


introalg:taller1

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
introalg:taller1 [2006/05/01 21:02] nicolaswintroalg:taller1 [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   * Introducción al uso de Hugs
-  * Como escribir programas Haskell+  * Cómo escribir programas Haskell 
 +  * Escribiendo los primeros programas 
  
-----+===== Clase =====
  
-[[http://haskell.org/hugs/|Hugs]] es un intérprete del lenguaje funcional puro [[http://haskell.org/|Haskell]]. +[[http://haskell.org/hugs/|Hugs]] es un intérprete del lenguaje funcional puro [[http://haskell.org/|Haskell]]. \\ 
-Durante este taller vamos a utilizarlo para escribirprobar utilizar los programas funcionales que se dan en el teórico.+Durante este taller escribiremosprobaremos utilizaremos los programas funcionales que se dan en el teórico.
  
 A Hugs se lo invoca desde la //línea de comandos// o picando sobre el ícono en nuestro entorno gráfico. 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 esta activo, la pantalla se presenta con un //prompt// a la espera de expresiones a ser evaluadas o commandos.+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   [nicolasw@azul Taller]$ hugs
Línea 24: Línea 29:
   Hugs.Base>   Hugs.Base>
  
-En este modo Hugs se convierte en una calculadora esperando que se introduzca una expresión para luego evaluarla y volver a pedir una expresión (lazo **leer-evaluar-imprimir**).+De este modo Hugs se convierte en una calculadoraesperando que se introduzca una expresión para evaluarla e imprimir el resultado, luego volver a pedir una expresión (lazo **leer-evaluar-imprimir**). \\
 Gracias al //preludio standard// tenemos muchas funciones ya definidas. Gracias al //preludio standard// tenemos muchas funciones ya definidas.
  
Línea 36: Línea 41:
   "daba le arroz al a zorra elabad"   "daba le arroz al a zorra elabad"
  
-Este ciclo continua indefinidamente hasta que pidamos la salida del intérprete con CTRL-D o con el comando+Este ciclo continúa indefinidamente hasta que pidamos la salida del intérprete con CTRL-D o con el comando
  
   Hugs.Base> :q   Hugs.Base> :q
Línea 42: Línea 47:
   [nicolasw@azul Taller]$   [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://es.wikipedia.org/wiki/Archivo_inform%C3%A1tico|archivo]] con terminación **.hs** donde se escriben en texto plano todas las definiciones que conforman el programa funcional. 
  
-A manera de ejemplo realicemos un ciclo de creación-carga-prueba-modificacion-recarga, con el Ejercicio 8.3 del apunte [[http://cs.famaf.unc.edu.ar/introalg/calculo_extracto.pdf|Extracto del Cálculo de Programas]].+ 
 +Para poder dar nuevas definiciones y/o funciones necesitamos escribir un //programa funcional// o //script// Haskell. \\  
 +Un programa funcional es un [[http://es.wikipedia.org/wiki/Archivo_inform%C3%A1tico|archivo]] con terminación **.hs** donde se escriben en //texto plano// todas las definiciones que conforman el programa funcional. 
 + 
 +A manera de ejemplo realicemos un ciclo de **creación-carga-prueba-modificación-recarga**, con el Ejercicio 8.3 del apunte [[http://cs.famaf.unc.edu.ar/introalg/calculo_extracto.pdf|Extracto del Cálculo de Programas]].
  
 Para crear un //script// basta con invocar el comando para editar un (nuevo) archivo '':e ejercicios8.hs''. Para crear un //script// basta con invocar el comando para editar un (nuevo) archivo '':e ejercicios8.hs''.
Línea 55: Línea 62:
           | x=0   = 0           | x=0   = 0
  
-Luego de salvar el programa y cargarlo, el intérprete indica un error pues '=' es el símbolo de definición, mientras que el igual lógico es ''==''.+Luego de salvar el programa y cargarlo, el intérprete indica un error pues ''='' es el símbolo de definición, mientras que la comparación es ''==''.
  
   Hugs.Base> :e ejercicios8.hs   Hugs.Base> :e ejercicios8.hs
-  Hugs.Base> :l ej 
   Hugs.Base> :l ejercicios8.hs   Hugs.Base> :l ejercicios8.hs
   ERROR "ejercicios8.hs":4 - Syntax error in input (unexpected `=')   ERROR "ejercicios8.hs":4 - Syntax error in input (unexpected `=')
Línea 64: Línea 70:
 Las traducciones son más o menos directas, de todas formas preparamos una tabla de [[http://cs.famaf.unc.edu.ar/introalg/traduccion.pdf|Traducción de Cálculo de Programas a Haskell]]. Las traducciones son más o menos directas, de todas formas preparamos una tabla de [[http://cs.famaf.unc.edu.ar/introalg/traduccion.pdf|Traducción de Cálculo de Programas a Haskell]].
  
-Volvemos a editar el script con '':e'' (el nombre ya no lo necesitamos ya que tenemos cargado este script) y corregimos el ''x=0'' por ''x==0''.+Volvemos a editar el script con '':e'' (el nombre ya no lo necesitamos ya que tenemos cargado este script) y corregimos ''x=0'' por ''x==0''.
 Podemos probar la nueva función para ganar confianza en su **corrección**. Podemos probar la nueva función para ganar confianza en su **corrección**.
  
Línea 91: Línea 97:
   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> map sgn [-10..10]
 +  [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1,1,1,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 96: Línea 105:
   * Tipos   * Tipos
   * 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, DVD-R, etc.).
 +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://es.wikipedia.org/wiki/Bisiesto|bisiesto]]:
 +
 +  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 ''ejercicios8.hs'' con el comando '':e''.
 +Veamos tres versiones distintas ((Esto es una mala copia de [[http://www.willamette.edu/~fruehr/haskell/evolution.html|The Evolution of a Haskell Programmer]])).
 +
 +**La del viejo programadora/or**
 +
 +  bisiesto'' :: Int -> Bool
 +  bisiesto'' n = if  n `mod` 4 /= 0 then False
 +                  else if n `mod` 100 /= 0 then True
 +                          else if n `mod` 400 == 0 then True
 +                                  else False
 +
 +**El que está aprendiendo Haskell**
 +
 +  bisiesto' :: Int -> Bool
 +  bisiesto' n     | n `mod` 4 /= 0 = False
 +                  | n `mod` 4 == 0 = n `mod` 100 /= 0 || n `mod` 400 == 0
 +
 +**El que cursó [[http://cs.famaf.unc.edu.ar/introalg/|Introducción a los Algoritmos]] ;-)**
 +
 +  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 ''filter'' para que obtener solo los años bisiestos desde 1945 al 2006.
 +
 +  Main> filter bisiesto [1945..2006]
 +  [1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004]
 +  Main> filter bisiesto' [1945..2006]
 +  [1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004]
 +  Main> filter bisiesto'' [1945..2006]
 +  [1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004]
 +
 +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,10,1968).(30,4,1987) = 18
 +  * Ejercicio 8.8
 +En un prisma rectangular, llamemos //h// a la altura, //b// al ancho y //d// a la profundidad. Completar
 +la siguiente definición del área del prisma: \\
 +//area.h.b.d = 2 ∗ frente + 2 ∗ lado + 2 ∗ arriba// \\
 +//|[   ...aca va la definicion...   ]|// \\
 +donde //frente//, //lado// y //arriba// son las caras frontal, lateral y superior del prisma respectivamente.
  
introalg/taller1.1146517337.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)