Lenguaje de 
programación 
funcional 
 Introducción a la Computación - I.T.I. - 1er año 
Prof. Rosana Alvarez 
I
Introducción 
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
Instalar y comenzar Haskell 
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
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
Calculemos con 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
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: predefinidos 
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)
Tipos simples predefinidos 
en Haskell 
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.
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 
Funciones y operadores 
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
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
El tipo 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 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.
El tipo Float 
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 1 
La notación científica: 1.5e 7 1.5e − 17 
Funciones y operadores del tipo Float 
Algunas 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 .
El tipo Double 
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 Float 
están también disponibles para el tipo Double.
El comando :type 
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.
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

Bt haskell-1

  • 1.
    Lenguaje de programación funcional  Introducción a la Computación - I.T.I. - 1er año Prof. Rosana Alvarez I
  • 2.
    Introducción El estilode 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
  • 3.
    Instalar y comenzarHaskell 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
  • 4.
    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
  • 5.
    Calculemos con 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
  • 6.
    Haskell Prelude> mod20112013 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.
  • 7.
    Haskell: predefinidos Sedenominan 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)
  • 8.
    Tipos simples predefinidos en Haskell 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.
  • 9.
    A continuación estudiaremoslos principales tipos de datos predefinidos (conjunto de elementos, que puede ser finito o infinito) y las funciones asociadas a éstos:
  • 10.
    El tipo Bool Funciones y operadores 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
  • 11.
    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)
  • 12.
    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
  • 13.
    El tipo 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.
  • 14.
    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.
  • 15.
    El tipo Float 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 1 La notación científica: 1.5e 7 1.5e − 17 Funciones y operadores del tipo Float Algunas 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 .
  • 16.
    El tipo Double 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 Float están también disponibles para el tipo Double.
  • 17.
    El comando :type 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.
  • 18.
    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.
  • 19.
    Operadores de igualdady 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.
  • 20.
    Escriba y evalúelas 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
  • 21.
    BIBLIOGRAFIA Razonando conHaskell –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