You are on page 1of 27

Unidad VI Paradigma Funcional Parte II

CONTENIDOS ABORDADOS

Introduccin al lenguaje Haskell. Funciones en Haskell Tipos de datos Sintaxis Entorno de Haskell Hugs Un programa en Haskell

Introduccin
Haskell es un lenguaje funcional puro. Es fuertemente tipado. Posee como caractersticas: polimorfismo de tipos,

evaluacin perezosa, funciones de alto orden, tipos definidos por el usuario, entre otras. Est especficamente diseado para manejar un amplio rango de aplicaciones, tanto numricas como simblicas. Posee una sintaxis expresiva y una gran variedad de constructores de tipos, a parte de los tipos convencionales (enteros, punto flotante y booleanos).

Funciones en Haskell

Las funciones en Haskell son objetos de primera clase. Pueden ser argumentos o resultados de otras funciones o ser componentes de estructuras de datos. Sintaxis: Definicin de signatura: La definicin de tipo de una funcin, donde se especifican los tipos de los datos de entrada y salida que posee la funcin; Implementacin del cuerpo de la funcin: Se especifica la descripcin de la funcin para transformar los datos de entrada en los datos de salida. nombre_funcion::tipo_argumento->tipo_resultado nombre_funcion nombre_argumento=<implementacion>

Funciones en Haskell
Ejemplo: Funcin parcializada (curried): suma::Integer -> Integer -> Integer suma x y = x + y La invocacin : suma 2 5 ==> 7

Funcin no parcializada (uncurried): suma ::(Integer, Integer) -> Integer suma (x, y) = x + y La invocacin : suma (2,5) ==> 7

Funciones : nominacin

Existen dos formas de nombrar una funcin: Identificador : Ejemplos: sum, product y fact Smbolo de operador : Ejemplos: * y + Los operadores se utilizan usando notacin infija: 4+3 x+y Tambin es posible usar la notacin prefija: (+) 4 3 (+) x y

Funciones : Expresiones lambda

Las expresiones lambda tienen la forma: \ <parmetros> -> <expr> Esta expresin denota una funcin que toma un nmero de parmetros, produciendo el resultado especificado por la expresin <expr>. Tambin llamada funcin annima. El clculo lambda permite utilizar una funcin dentro de otra sin darle nombre. funcin x = y es lo mismo que decir funcin = \x -> y

Funciones : Expresiones lambda

Ejemplos: cuadrado::Integer -> Integer cuadrado x = x*x o en forma annima: (\x->x*x) suma ::Integer -> Integer -> Integer suma x y = x + y Su forma annima: \x y -> x+y Si evaluamos esta ltima: (\x y->x+y) 2 3 == > 5

Anlisis de expresiones

El anlisis de las expresiones en Haskell, posee dos fases: Anlisis sintctico, para chequear la correccin sintctica de las expresiones. Anlisis de tipo, para chequear que todas las expresiones tienen un tipo correcto.

Tipos de Datos : Sistema de Tipos

Haskell es un lenguaje de programacin fuertemente tipado. El sistema de tipos que es utilizado para detectar errores en expresiones y definiciones de funcin. El universo de valores es particionado en colecciones organizadas, denominadas tipos. Cada tipo tiene asociadas un conjunto de operaciones.

Tipos de Datos : Inferencia de Tipos

Haskell cuenta con un sistema de inferencia de tipos que consiste en:


El programador no est obligado a declarar el tipo de las expresiones. El compilador contiene un algoritmo que infiere el tipo de las expresiones. Si el programador declara el tipo de alguna expresin, el sistema chequea que el tipo declarado coincide con el tipo inferido.

Los sistemas de inferencia de tipos permiten una mayor seguridad evitando errores de tipo en tiempo de ejecucin y una mayor eficiencia, evitando realizar comprobaciones de tipos en tiempo de ejecucin.

Tipos de Datos : Inferencia de Tipos

Por ejemplo, si el programador declara la siguiente funcin: eligeSaludo x = if x then "adios" else "hola" El sistema infiere automticamente que el tipo es eligeSaludo::Bool -> String y, si el Programador hubiese declarado que tiene un tipo diferente, el sistema dara un error de tipos. Los sistemas de inferencia de tipos aumentan su flexibilidad mediante la utilizacin del polimorfismo.

Tipos de Datos predefinidos


Clasificacin:

tipos bsicos, cuyos valores se toman como primitivos, por ejemplo, Enteros, Flotantes, Caracteres y Booleanos. tipos compuestos, cuyos valores se construyen utilizando otros tipos, por ejemplo, listas, funciones y tuplas.

Tipos Bsicos
Booleanos Se representan por el tipo "Bool" y contienen dos valores: "True" y "False". Las funciones para manipular valores bolanos son: (&&), (||) y not. x && y es True si y slo si x e y son True x || y es True si y slo si x y ambos son True not x es el valor opuesto de x (not True = False,not False = True)

Tipos Bsicos
Enteros Representados por el tipo "Int", se incluyen los enteros positivos y negativos. Tambin se puede utilizar el tipo Integer que denota enteros sin lmites superior ni inferior. Algunos operadores y funciones que manipulan enteros:

(+) suma. (*) multiplicacin. (-) substraccin. (^) potenciacin. negate (la expresin "-x" se toma como "negate x") div divisin entera " "

Tipos Bsicos
Flotantes Representados por el tipo "Float", los elementos de este tipo pueden ser utilizados para representar fraccionarios as como cantidades muy grandes para ser representadas por un entero. Tambin se puede utilizar notacin cientfica (1.0e3 1000.0). Algunos operadores y funciones :

(+), (-), (*), (/) (^) Exponenciacin con exponente entero. truncate (trunca la parte decimal). round Convierte un nmero fraccionario en un entero redondeando hacia el entero ms cercano. sqrt Raz cuadrada (positiva).

Tipos Bsicos
Caracteres Representados por el tipo "Char", los elementos de este tipo representan caracteres individuales. Se escriben encerrando el valor entre comillas simples, por ejemplo 'a', '0', '.' y 'Z'. Los caracteres especiales deben ser introducidos utilizando un cdigo de escape:

'\\' barra invertida '\'' comilla simple '\"' comilla doble '\n' salto de lnea '\t' or '\HT' tabulador

Sintaxis
Case sensitive La sintaxis de Haskell diferencia entre maysculas y minsculas. Comentarios En una lnea: utiliza el smbolo -- que inicia un comentario y ocupa la parte de la lnea hacia la derecha del smbolo. Por ejemplo: -- Este es un comentario, cuando empieza con "-- MultiLinea: utiliza {- para inicia el comentario y -} para finalizarlo. Por ejemplo: {- Este es un comentario, en dos lneas-}

Sintaxis
Valores

Los valores son entidades abstractas que se consideran como la respuesta a un clculo 5 -1 8 Cada valor tiene asociado un tipo (<valor> :: <tipo>) 2 :: Int

Expresiones

Las expresiones son trminos construidos a partir de valores (2*3)+(4-5) Toda expresin tiene un tipo: el tipo del valor que resulta de reducir la expresin (2*3)+(4-5) :: Int

Sintaxis
Identificadores Un identificador Haskell consta de una letra seguida por cero o ms letras, dgitos, subrayados y comillas simples. Por ejemplos : sum f f fintSum nombre_con_guiones Los siguientes identificadores son palabras reservadas y no pueden utilizarse como nombres de funciones o variables: case of where let in if then else data type infix infixl infixr class instance primitive

Sintaxis
Identificadores (continuacin)

La letra inicial del identificador distingue familias de identificadores: empiezan por: Mayscula los tipos y constructores de datos Minscula los nombres de funcin y variables

Sintaxis
Operadores

Son funciones que se escriben entre sus (dos) argumentos en lugar de precederlos. Por ejemplo, 3 <= 4 en lugar de menorIgual 3 4 Un smbolo de operador es escrito utilizando uno o ms de los siguientes caracteres: : ! # $ % & * + . / < = > ? @ \ ^ | -

Sintaxis
Operadores

Precedencia Cada operador tiene asignado un valor de precedencia (un entero entre 0 y 9). Asociatividad Por ejemplo, el smbolo (-) se puede decir que es: Asociativo a la izquierda: si la expresin "x-y-z" se toma como "(x-y)-z" Asociativo a la derecha: si la expresin "x-y-z" se toma como "x-(y-z)"

No asociativo: Si la expresin "x-y-z" se rechaza como un error sintctico.

Entorno de Haskell - Hugs

Hugs es un entorno libre, est disponibles para distintas plataformas (MS-Windows, Mac OS X,Unix), presenta una interfaz de usuario flexible y es bastante eficiente. Funciona siguiendo el modelo de una calculadora en el que se establece una sesin interactiva entre el ordenador y el usuario. Una vez arrancado, el sistema muestra un prompt Hugs> y espera a que el usuario introduzca una expresin (denominada expresin inicial y presione la tecla <RETURN>. Cuando la entrada se ha completado, el sistema evala la expresin e imprime su valor y despues vuelve a mostrar el prompt.

Entorno de Haskell - Hugs


Evaluacin de expresiones: Hugs> (2+3)*8 40 :: Integer El usuario introduce la expresin "(2+3)*8" que es evaluada por el sistema imprimiendo como resultado el valor "40".

Hugs> (2+3)+(3*5) 20 :: Integer

Entorno de Haskell - Hugs


Definicin de funciones

Las funciones se pueden almacenar en un fichero de forma que el sistema pueda utilizarlas en el proceso de evaluacin. El mismo debe tener la extensin hs. Por ejemplo, se crea el archivo ejemplo1.hs: cuadrado::Integer -> Integer cuadrado x = x * x Para utilizar las definicin de este archivo hay que cargarlo en el sistema con la orden :load. Hugs>:load emjemplo1.hs Si el fichero se carg con xito, el usuario ya podra utilizar la definicin: Main> cuadrado 2 4 :: Integer

Un programa en Haskell

Para escribir un programa en Haskell hay que cumplir los siguientes pasos: Escribir un script con la definicin de todas las funciones que necesitemos para resolver el problema, en un archivo de texto que se graba con la extensin .hs. Cargar el script en Hugs. Para ello utilizamos el comando :load seguido del nombre del archivo. Ingresar en el prompt la expresin a evaluar y presionar la tecla <RETURN>, para que el sistema evale la expresin e imprima su valor antes de volver a mostrar el prompt.

You might also like