Professional Documents
Culture Documents
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
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
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.
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.
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.
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 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)"
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.
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.