Tema 2: Introducción a la programación con Haskell
1 El sistema GHC
Los programa funcionales pueden evaluarse manualmente (como en el tema anterior).
Los lenguajes funcionales evalúan automáticamente los programas funcionales.
Haskell es un lenguaje funcional.
GHC (Glasgow Haskell Compiler) es el intérprete de Haskell que usaremos en el curso.
2 Iniciación a GHC
2.1 Inicio de sesión con GHCi
Inicio mediante ghci
I1M> ghci
GHCi, version 6.10.3: http://www.haskell.org/ghc/ :? for help
ghci>
La llamada es ghci>
Indica que ha cargado las definiciones básicas que forman el preludio y el sistema está listo para leer una expresión, evaluarla y escribir su resultado.
Seleccionar el primer elemento de una lista no vacía:
head [1,2,3,4,5] == 1
Eliminar el primer elemento de una lista no vacía:
tail [1,2,3,4,5] == [2,3,4,5]
Seleccionar el n-ésimo elemento de una lista (empezando en 0):
[1,2,3,4,5] !! 2 == 3
Seleccionar los n primeros elementos de una lista:
take 3 [1,2,3,4,5] == [1,2,3]
Eliminar los primeros elementos de una lista:
drop 3 [1,2,3,4,5] == [4,5]
Calcular la longitud de una lista:
length [1,2,3,4,5] == 5
Calcular la suma de una lista de números:
sum [1,2,3,4,5] == 15
Calcular el producto de una lista de números:
product [1,2,3,4,5] == 120
Concatenar dos listas:
[1,2,3] ++ [4,5] == [1,2,3,4,5]
Invertir una lista:
reverse [1,2,3,4,5] == [5,4,3,2,1]
2.4 Cálculos con errores
Ejemplos de cálculos con errores
ghci> 1 `div` 0
*** Exception: divide by zero
ghci> head []
*** Exception: Prelude.head: empty list
ghci> tail []
*** Exception: Prelude.tail: empty list
ghci> [2,3] !! 5
*** Exception: Prelude.(!!): index too large
3 Aplicación de funciones
3.1 Aplicación de funciones en matemáticas y en Haskell
Notación para funciones en matemáticas:
En matemáticas, la aplicación de funciones se representa usando paréntesis y la multiplicación usando yuxtaposición o espacios
Ejemplo: representa la suma del valor de aplicado a y más el producto de por .
Notación para funciones en Haskell:
En Haskell, la aplicación de funciones se representa usando espacios y la multiplicación usando *
Ejemplo: f a b + c*d representa la suma del valor de f aplicado a a y b más el producto de c por d.
3.2 Prioridad de la aplicación de funciones
En Haskell, la aplicación de funciones tiene mayor prioridad que los restantes operadores. Por ejemplo, la expresión Haskell f a + b representa la expresión matemática .
Ejemplos de expresiones Haskell y matemáticas:
Matemáticas
Haskell
f x
f x y
f (g x)
f x (g y)
f x * g y
4 Guiones Haskell
En Haskell los usuarios pueden definir funciones.
Las nuevas definiciones se definen en guiones, que son ficheros de textos compuestos por una sucesión de definiciones.
Se acostumbra a identificar los guiones de Haskell mediante el sufijo .hs
4.1 El primer guión Haskell
Iniciar emacs y abrir dos ventanas: C-x 2
En la primera ventana ejecutar Haskell: M-x run-haskell
Cambiar a la otra ventana: C-x o
Iniciar el guión: C-x C-f ejemplo.hs
Escribir en el guión las siguientes definiciones
doble x = x+x
cuadruple x = doble (doble x)
Grabar el guión: C-x C-s
Cargar el guión en Haskell: C-c C-l
Evaluar ejemplos:
ghci> cuadruple 10
40
ghci> take (doble 2) [1,2,3,4,5,6]
[1,2,3,4]
Volver al guión: C-x o
Añadir al guión las siguientes definiciones:
factorial n = product [1..n]
media ns = sum ns `div` length ns