Lenguaje de programación
funcional
Introducción a la Computación - I.T.I. - 1er año
Pro
f.
Ro
san
a
Alv
are
z
I
El estilo de programación funcional está basado en expresiones:
- Un programa es un conjunto de definiciones de funciones matemáticas
- La ejecución de un programa es la evaluación de una expresión que contiene funciones definidas por el usuario.
Veremos una breve introducción a este lenguaje
Introducción
Descargamos el programa que nos permite ejecutar
Haskell en: http://hackage.haskell.org/platform/
Elegimos el sistema operativo que corresponde.
Para Windows descargamos el archivo
HaskellPlatform-2011.2.0.0-setup.exe
Para ejecutar lo que denominaremos de ahora en
más el intérprete de Haskell, accedemos a:Inicio/Todos los programas/HaskellPlataform/winGHCi
Instalar y comenzar Haskell
La línea : Prelude> denominada intérprete de comandos de Haskell, es la que aparece cuando no hay nada definido por el usuario cargado en el ambiente de Haskell.
Para salir del intérprete se puede usar la opción del menú, o escribir en el intérprete de comandos.
:quit o :q
Haskell
Escribe, en la línea de comandos, las siguientes expresiones:
1) 30*12 2) 2^5 3) 24*(67-111)
4) 2^(5+3) 5) 23/4 6) sqrt 25
7) mod 23 4 8) div 23 4
¿Cuál es el comportamiento de las funciones div y mod, predefinidas en Haskell?
¿En qué casos son ”útiles” estas funciones?
Por ejemplo, queremos ”extraer” dia, mes y año de una fecha ingresada como una cadena de números: 20112013
Calculemos con Haskell
Prelude> mod 20112013 10000
2013 ------ es el año
Prelude> div 20112013 1000000
20 ------ es el día
Prelude> div 20112013 10000
2011 ------ contiene el día, pero…
Prelude> mod (div 20112013 10000) 100
11 ------ este si es el día
Podemos escribir una función que nos devuelva el día, o mes o año de una fecha dada, lo haremos en próximas clases.
Haskell
Se denominan predefinidos a los elementos del
lenguaje que están disponibles para su uso cada vez
que ejecutamos Haskell. Están definidos en un archivo
de Haskell especial que se denomina PRELUDE (y las
funciones asociadas a éstos).
No se pueden realizar definiciones en línea de
comandos, para ello se deberá utilizar un archivo de
texto ( .hs en ambiente windows)
Haskell: predefinidos
El significado del operador :: en Haskell es “tiene tipo” o “es de tipo”. Se usa para indicar el tipo de cualquier expresión pues toda expresión en Haskell tiene tipo.
Por ejemplo:
4 :: Int, significa que 4 es de tipo Int
(8<4) :: Bool, significa que (8<4) es de tipo Bool && :: Bool → Bool → Bool, significa que && es de
tipo Bool en Bool en Bool.
Tipos simples predefinidos en Haskell
A continuación estudiaremos los principales tipos de datos predefinidos (conjunto de elementos, que puede ser finito o infinito) y las funciones asociadas a éstos:
El tipo Bool
Los valores de este tipo representan expresiones lógicas, cuyo resultado de evaluación puede ser True o False:
Conjunción lógica &&: BoolxBool → Bool
Disyunción lógica ||: BoolxBool → Bool
Negación lógica not : Bool → Bool
Otherwise otherwise : Bool
Otherwise: función constante que devuelve el valor True
Funciones y operadores
Notación currificada:
&&: Bool → Bool → Bool
||: Bool → Bool → Bool
Los operadores && y || utilizan notación infija.
El operador not utiliza notación prefija.
Calcular en Haskell:
1) (8>2) || (4>1)
2) (8>2) && (4>1)
3) (8>2) && (4<1)
El tipo Int
Los valores de este tipo son números enteros de precisión limitada. El intervalo de representación de Int depende de la arquitectura de la máquina y de la implementación de Haskell.
Para determinar este intervalo se pueden usar las expresiones minBound y maxBound que también son de tipo entero y determinar el rango de Int, escribir:
Prelude> minBound::Int
Prelude> maxBound::Int
Funciones y operadores
(+) :: Int ->Int -> Int. Suma de enteros.
(-) :: Int ->Int -> Int. Resta de enteros.
(*) :: Int ->Int -> Int. Producto de enteros.
(^) :: Int -> Int -> Int. Operador potencia, el exponente debe ser natural
div :: Int -> Int -> Int. Cociente de la división entera.
mod :: Int -> Int -> Int. Resto de la división entera.
abs :: Int -> Int. Valor absoluto
even:: Int -> Bool. Dado un entero indica si es par.
odd :: Int -> Bool. Dado un entero indican si es impar.
El tipo Int
El tipo Char
Un valor de tipo Char representa un caracter, es decir: una letra, un dígito, un signo de puntuación, etc. Un valor constante de tipo Char se escribe siempre entre comillas simples.
• ‘a’ denota la letra a minúscula
• ‘1’ denota al carácter correspondiente al dígito 1. No confundir con 1 de tipo Int.
• ‘?’ denota al símbolo correspondiente al signo de interrogación.
Subconjunto de un intervalo de los números reales.Hay dos modos de escribir valores reales:La notación habitual: 1.35 −15.345 1.0 1La notación científica: 1.5e 7 1.5e − 17
El tipo Float
Funciones y operadores del tipo FloatAlgunas de las funciones y operadores predefinidos
para este tipo son:
(+) :: Float ->Float -> Float. Suma de reales.
(-) :: Float ->Float -> Float. Resta de reales.
(*) :: Float ->Float -> Float. Producto de reales.
(^) :: Float -> Int -> Float. Potencia, base real y exponente natural .
Se trata de un subconjunto de un intervalo de los números reales.
El subconjunto es mayor que el correspondiente al tipo Float y las aproximaciones mas precisas.
Todas las operaciones disponibles para el tipo Floatestán también disponibles para el tipo Double.
El tipo Double
Prelude> :type <expr> Prelude> :t <expr>
Nos devuelve el tipo de una expresión.
Es útil para saber si el tipo de una expresión que queremos usar se corresponde con lo que pensamos.
El comando :type
Verificar en Haskell:
1. :type 'a'
2. :type "abcdf"
3. :type True
4. :type 4<5
5. :type "a"
6. length "perro"
7. Deducir el tipo de length
8. Verificar :type length
9. Escribir y probar en Haskell sus propias expresiones.
Operadores de igualdad y orden
Para todos los tipos básicos están definidos los siguientes operadores binarios:
> Mayor que >= Mayor o igual que
< Menor que <= Menor o igual que
== Igual a /= Distinto de
Observación: el tipo de los dos argumentos para cualquier aplicación de los operadores anteriores debe ser el mismo. No se pueden comparar valores de tipos distintos.
Escriba y evalúe las siguientes expresiones :
1) 7<0
2) 8>2
3) div 8 4 == 2
4) div 4 3 == 0
5) mod 8 4 == 0
6) not (mod 8 4 == 7)
7) 4 /=4
8) div 8 9 /= 20
9) mod 50 10 <= 0
10) div 50 10 >= 6
BIBLIOGRAFIA
Razonando con Haskell –Un cursos sobre programación funcional – J. Gallardo- B.Ruiz, F Gutierrez y otros - 2004
Temas de programac. Funcional - – J. Alonso Jimenez - 2011
Ejercicios de programación funcional – J. Alonso Jimenez –
Piensa en Haskell – J. Alonso Jimenes y J. Hidalgo - 2012
Material sobre Haskell- Inet- Prof. Paula Echenique - 2008
Introducción al lenguaje Haskell - José E.Labra - 1998
Programación Funcional – Jeroen Fokker – 1996
Algoritmos y Programación, guia para Haskell – A.Leon Molina 1998