Você está na página 1de 16

1

1.

HISTORIA DE HASKELL

A principios de la dcada de los setenta aparecieron los primeros sntomas de lo


que se ha denominado crisis del software. Los programadores que se enfrentan a
la construccin de grandes sistemas de software observan que sus productos no
son fiables. La alta tasa de errores conocidos (bugs) o por conocer pone en peligro
la confianza que los usuarios depositan en sus sistemas.
Cuando los programadores quieren corregir los errores detectados se enfrentan a
una dura tarea de mantenimiento- Cuando se intenta corregir un error detectado,
una pequea modificacin trae consigo una serie de efectos no deseados sobre
otras partes del sistema que, en la mayora de las ocasiones, empeora la situacin
inicial.
La raz del problema radica en la dificultad de demostrar que el sistema cumple
los requisitos especificados. La verificacin formal de programas es una tcnica
costosa que en raras ocasiones se aplica.
Por otro lado, el incremento en la potencia de procesamiento lleva consigo un
incremento en la complejidad del software. Los usuarios exigen cada vez mayores
prestaciones cuyo cumplimiento sigue poniendo en evidencia las limitaciones de
recursos y la fragilidad del sistema.
Las posibles soluciones podran englobarse en las siguientes lneas de
investigacin:
Ofrecer nuevos desarrollos de la Ingeniera del Software que permitan solucionar
el problema del Anlisis y Diseo de grandes Proyectos Informticos. Actualmente
las Metodologas Orientadas a Objetos han aportado una evolucin importante
dentro de este campo.
Proporcionar Sistemas de Prueba y Verificacin de programas cuya utilizacin no
sea costosa.

Ivonne Corona Ochoa

11420 394

Construir tcnicas de Sntesis de Programas que permitan obtener, a partir de


unas especificaciones formales, cdigo ejecutable.
Disear nuevas Arquitecturas de Computadoras, en particular, tcnicas de
procesamiento en paralelo.
Proponer un modelo de computacin diferente al modelo imperativo tradicional.
Esta ltima solucin se basa en la idea de que los problemas mencionados son
inherentes al modelo computacional utilizado y su solucin no se encontrar a
menos que se utilice un modelo diferente. Entre los modelos propuestos se
encuentra la programacin funcional o aplicativa, cuyo objetivo es describir los
problemas mediante funciones matemticas puras sin efectos laterales, y la
programacin lgica o declarativa, que describe los problemas mediante
relaciones entre objetos.

2.

INTRODUCCION

Haskell es un lenguaje funcional puro, de propsito general, que incluye muchas


de las ltimas innovaciones en el desarrollo de los lenguajes de programacin
funcional, como son las funciones de orden superior, evaluacin perezosa, tipos
polimrficos estticos, tipos definidos por el usuario, encaje por patrones, y
definiciones de listas por compresin. Incorpora, adems, otras caractersticas
interesantes como el tratamiento sistemtico de la sobrecarga, la facilidad en la
definicin de tipos abstractos de datos, el sistema de entrada/salida puramente
funcional y la posibilidad de utilizacin de mdulos.

3.

QU ES HASKELL?

Haskell es un lenguaje de programacin moderno, estndar, no estricto,


puramente funcional. Posee todas las caractersticas avanzadas, incluyendo
polimorfismo de tipos, evaluacin perezosa y funciones de alto orden.
Tambin es un tipo de sistema que soporta una forma sistemtica de
sobrecarga y un sistema modular. Est especficamente diseado para manejar
un ancho rango de aplicaciones, tanto numricas como simblicas. Para este

Ivonne Corona Ochoa

11420 394

fin, Haskell tiene una sintaxis expresiva y una gran variedad de constructores de
tipos, a parte de los tipos convencionales (enteros, punto flotante y booleanos).
Hay disponible un gran nmero de implementaciones. Todas son gratis. Los
primeros usuarios, tal vez, deban empezar con Hugs, un intrprete pequeo y
portable de Haskell.

4.

POR QU SE UTILIZA HASKELL?

Escribir en grandes sistemas software para trabajar es difcil y caro. El


mantenimiento de estos sistemas es an ms caro y difcil. Los lenguajes
funcionales, como Haskell pueden hacer esto de manera ms barata y ms
fcil. Haskell, un lenguaje puramente funcional ofrece:
1. Un incremento substacial de la productividad de los programas.
2. Cdigo ms claro y ms corto y con un mantenimiento mejor.
3. Una semntica de huecos ms pequea entre el programador y el lenguaje.
4. Tiempos de computacin ms cortos.
Haskell es un lenguaje de amplio espectro, apropiado para una gran
variedad de aplicaciones. Es particularmente apropiado para programas que
necesitan ser altamente codificados y mantenidos.
La vida de muchos productos software se basa en la especificacin, el diseo y el
mantenimiento y no en la programacin.
Los lenguajes funcionales son idneos para escribir especificaciones que
actualmente son ejecutadas (y, por lo tanto, probadas y depuradas).Tal
especificacin es, por tanto, el primer prototipo del programa final.

Ivonne Corona Ochoa

11420 394

5.

MECIONA UNA CLASIFICACIN DE

LOS LENGUAJES SIMILARES


Lenguajes de Programacin Funcionales Los lenguajes funcionales se basan en el
concepto de funcin y su definicin mediante ecuaciones , que constituyen el
programa. Puros Scheme Erlang Rust Objective Caml Haskell Rubi Goofer Joy
Dominio especfico R (estadstica) Mathematica (matemticas simblicas) J y K
(anlisis financiero) F# en Microsoft.NET XSLT (XML) Erlang, Usado para probar
el sistema de tolerancia a fallos en las telecomunicaciones. WhatsApp, Facebook,
o T-Mobile optaron por Erlang como lenguaje en alguno de sus desarrollos.
Scheme de Lisp, que fue usado en aplicaciones para los primeros ordenadores de
Apple Macintosh; hoy en da, est siendo usado para desarrollo de sistemas de
simulacin y de control de telescopio. Haskell, se ha usado para el desarrollo de
sistemas aeroespaciales, programacin web y diseo hardware. Otros lenguajes
de programacin funcionales han sido usados en mbitos comerciales y
financieros.

6.

FUTURO DE HASKELL

Haskell 98 est completo. Es la definicin oficial y actual de Haskell. Se


espera que este lenguaje pueda

seguir

funcionando

aunque

se

aadan

nuevas extensiones y los compiladores seguirn apoyndose en Haskell 98.


No

obstante, han sido

propuestas muchas extensiones que han

implementadas en algunos sistemas Haskell;


guardas,

clases de

tipos

con

multiparmetros,

universales, etc.

Ivonne Corona Ochoa

por

11420 394

ejemplo

el

diseo

sido
de

cuantificaciones locales y

La lista de correo de Haskell es un forum de discusin sobre las


caractersticas de los nuevos lenguajes. La gente

propone una nueva

caracterstica de algn lenguaje y trata de convencer a los investigadores


sobre la conveniencia de desarrollarla en algn sistema Haskell. Al final, la gente
que est interesada de verdad define esta nueva caracterstica en Haskell 98 y lo
presenta en un documento que es aadido a esta lista de correo. Un buen ejemplo
de la utilidad de este proceso es la creacin de FFI (Foreing Function Interface) en
Haskell. Haskell II ha sido desarrollado durante mucho tiempo por un comit
lder ado por John Launchbury. Obviamente las extensiones que hayan sido bien
descritas ycomprobadas tendrn ms probabilidad de ser aceptadas.

7.

TIPOS DE DATOS

Una parte importante del lenguaje Haskell lo forma 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 que no tienen
significado para otros tipos, por ejemplo, se puede aplicar la funcin (+) entre
enteros pero no entre caracteres o funciones.
Una propiedad importante del Haskell es que es posible asociar un nico tipo a
toda expresin bien formada. Esta propiedad hace que el Haskell sea un lenguaje
fuertemente tipado. Como consecuencia, cualquier expresin a la que no se le
pueda asociar un tipo es rechazada como incorrecta antes de la evaluacin. Por
ejemplo:
f x = 'A'
gx=x+fx

La expresin 'A' denota el caracter A. Para cualquier valor de x, el valor de f x es


igual al carcter 'A', por tanto es de tipo Char. Puesto que el (+) es la operacin

Ivonne Corona Ochoa

11420 394

suma entre nmeros, la parte derecha de la definicin de g no est bien formada,


ya que no es posible aplicar (+) sobre un caracter.
El anlisis de los escritos puede dividirse en dos fases: Anlisis sintctico, para
chequear la correccin sintctica de las expresiones y anlisis de tipo, para
chequear que todas las expresiones tienen un tip correcto.
8.

TIPOS PREDEFINIDOS

En esta seccin se indican los principales tipos predefinidos del sistema Haskell,
stos se podran clasificar en: tipos bsicos, cuyos valores se toman como
primitivos, por ejemplo, Enteros, Flotantes, Caracterses y Booleanos; y tipos
compuestos cuyos valores se construyen utilizando otros tipos, por ejemplo, listas,
funciones y tuplas.
Booleanos
Se representan por el tipo "Bool" y contienen dos valores: "True" y "False". El
standar prelude incluye varias funciones para manipular valores booleanos: (&&),
(||) y not.

Tambin se incluye una forma especial de expresin condicional que permite


seleccionar entre dos alternativas dependiendo de un valor booleano:
if exp_b then x else y
Si la expresin booleana exp_b es True devuelve x, si es False, devuelve y.
Obsrvese que una xpresin de ese tipo slo es aceptable si exp_b es de tipo
Booly x e y son del mismo tipo.

Ivonne Corona Ochoa

11420 394

Enteros
Representados por el tipo "Int", se incluyen los enteros positivos y negativos tales
como el 273, el 0 el 383. Como en muchos sistemas, el rango de los enteros
utilizables est restringido. Tambin se puede utilizar el tipo Integer que denota
enteros sin lmites superior ni inferior.
En el standar prelude se incluye un amplio conjunto de operadores y funciones
que manipulan enteros:

9.

FUNCIONES

Si a y b son dos tipos, entonces a->b es el tipo de una funcin que toma
como

argumento

un elemento de tipo a y devuelve un valor de tipo b. Las

funciones en Haskell son objetos de primera clase. Pueden ser argumentos


o resultados de otras funciones o ser componentes de estructuras de datos. Esto
permite simular mediante funciones de un nico argumento, funciones con
mltiples argumentos.

Ivonne Corona Ochoa

11420 394

Considrese, por ejemplo, la funcin de suma (+). En matemticas se toma la


suma como una funcin que toma una pareja de enteros y devuelve un entero. Sin
embargo, en Haskell, la funcin suma tiene el tipo: (+)::Int->(Int->Int)(+) es una
funcin de un argumento de tipo Int que devuelve una funcin de tipo Int>Int. De hecho "(+) 5" denota una funcin que toma un entero y devuelve dicho
entero ms 5. Este proceso se denomina currificacin (en honor a Haskell
B.Curry)y permite reducir el nmero de parntesis necesarios para escribir
expresiones.

De

hecho,

no

es

necesario

escribir f(x) para

denotar

la

aplicacin del argumento x a la funcin x, sino simplemente f x.

10.

ENTORNO DE HASKELL (HUGS)

El entorno HUGS 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 "?" 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 antes de volver a mostrar el prompt para esperar a que se introduzca la
siguiente expresin

11.

LISTAS

Ia es un tipo cualquiera, entonces [a] representa el tipo de listas cuyos elementos


son valores de tipo a.
Hay varias formas de escribir expresiones de listas:
- La forma ms simple es la lista vaca, representada mediante [].
- Las listas no vacas pueden ser construidas enunciando explcitamente sus el
ementos (por ejemplo, [1,3,10]) o aadiendo un elemento al principio de otra lista
utilizando el operador de construccin (:). Estas notaciones son equivalentes:
[1,3,10] = 1:[3,10] = 1:(3:[10]) = 1:(3:(10:[])) El
la

derecha,

de

forma

operador

que 1:3:10:[] equivale

primer elemento es 1, el segundo 3 y el ltimo 10.

Ivonne Corona Ochoa

11420 394

(:)

es

asociativo

a (1:(3:(10:[]))), una lista cuyo

El standar prelude incluye un amplio conjunto de funciones de manejo de listas,


por ejemplo: length xs

devuelve el nmero de elementos de xs xs ++ ys

devuelve la lista resultante de concatenar xs e ys concat xss

devuelve la lista

resultante de concatenar las listas de xss map f xs devuelve la lista de valores


obtenidos al aplicar la funcin f a cada uno de los elementos de la lista xs.

12.

-TUPLAS

Si t1, t2,..., tn son tipos y n>=2, entonces hay un tipo de n-tuplas escrito (t1, t2, ...,
tn) cuyos elementos pueden ser escritos tambin como (x1, x2,..., xn) donde cada
x1, x2, ...,xn tiene tipos t1,t2, ..., tn respectivamente.
Ejemplo:
(1, [2], 3) :: (Int, [Int], Int)
('a', False) :: (Char, Bool)
((1,2),(3,4)) :: ((Int, Int), (Int, Int))
Obsrvese que, a diferencia de las listas, los elementos de una tupla pueden tener
tipos diferentes. Sin embargo, el tamao de una tupla es fijo.
En determinadas aplicaciones es til trabajar con una tupla especial con 0
elementos denominada tipo unidad. El tipo unidad se escribe como () y tiene un
nico elemento que es tambin ().

13.

-ECUACIONES DE GUARDAS

Cada una de las ecuaciones de una definicin de funcin podra contener guardas
que requieren que se cumplan ciertas condiciones sobre los valores de los
argumentos.
minimo x y | x <= y = x
| otherwise = y
En general una ecuacin con guardas toma la forma:
f x1 x2,... xn | condicion1 = e1
| condicion2 = e2

Ivonne Corona Ochoa

11420 394

10

.
.
| condicionm = em
Esta ecuacin se utiliza para evaluar cada una de las condiciones por orden hasta
que alguna de ellas sea "True", en cuyo caso, el valor de la funcin vendr dado
por la expresin correspondiente en la parte derecha del signo "=".
En Haskell, la variable "otherwise" evala a "True". Por lo cual, escribir "otherwise"
como una condicin significa que la expresin correspondiente ser siempre
utilizada si no se cumpli ninguna condicin previa.
14. -

DISPOSICIN DEL CDIGO

El lector se habr preguntado cmo es posible evitar la utilizacin de separadores


que marquen el final de una ecuacin, una declaracin, etc. Por ejemplo, la
siguiente expresin:

La respuesta es que el Haskell utiliza una sintaxis bidimensional denominada


espaciado (layout) que se basa esencialmente en que las declaraciones estn
alineadas por columnas.
Las reglas del espaciado son bastante intuitivas y podran resumirse en:
1. El siguiente caracter de cualquiera de las palabras clave where, let, o of es
el que determina la columna de comienzo de declaraciones en las
expresiones where, let, o case correspondientes. Por tanto podemos
comenzar las declaraciones en la misma lnea que la palabra clave, en la
siguiente o siguientes.

Ivonne Corona Ochoa

11420 394

11

2. Es necesario asegurarse que la columna de comienzo dentro de una


declaracin est ms a la derecha que la columna de comienzo de la
siguiente clusula. En caso contrario, habra ambigedad, ya que el final de
una declaracin ocurre cuando se encuentra algo a la izquierda de la
columna de comienzo.
El espaciado es una forma sencilla de agrupamiento que puede resultar bastante
til. Por ejemplo, la declaracin anterior sera equivalente a:

15.

-TIPOS RECURSIVOS

Los tipos de datos pueden autor referenciarse consiguiendo valores recursivos,


por ejemplo:
data Expr = Lit Integer
| Suma Expr Expr
| Resta Expr Expr
eval (Lit n) = n
eval (Suma e1 e2) = eval e1 + eval e2
eval (Resta e1 e2) = eval e1 * eval e2
Tambin pueden definirse tipos de datos polimrficos. El siguiente ejemplo define
un tipo que representa rboles binarios:
data Arbol a = Hoja a | Rama (Arbol a) (Arbol a)
Por ejemplo,
a1 = Rama (Rama (Hoja 12) (Rama (Hoja 23) (Hoja 13)) (Hoja 10)
tiene tipo Arbol Integer y representa el rbol binario de la figura :

Ivonne Corona Ochoa

11420 394

12

16.

-EVALUACIN PEREZOSA

Los lenguajes tradicionales, evalan todos los argumentos de una funcin antes
de conocer si stos sern utilizados. Dicha tcnica de evaluacin se conoce como
evaluacin ansiosa (eager evaluation) porque evala todos los argumentos de una
funcin antes de conocer si son necesarios.
Por otra parte, en ciertos lenguajes funcionales se utiliza evaluacin perezosa
(lazy evaluation) que consiste en no evaluar un argumento hasta que no se
necesita.
Haskell, Miranda y Clean son perezosos, mientras que LISP, SML, Erlang y
Scheme son estrictos.
Uno de los beneficios de la evaluacin perezosa consiste en la posibilidad de
manipular estructuras de datos 'infinitas'. Evidentemente, no es posible construir o
almacenar un objeto infinito en su totalidad.
Sin embargo, gracias a la evaluacin perezosa se puede construir objetos
potencialmente infinitos pieza a pieza segn las necesidades de evaluacin.

17.

-SOBRECARGA

CLASES

EN

HASKELL
Cuando una funcin puede utilizarse con diferentes tipos de argumentos se dice
que est sobrecargada.
La funcin (+), por ejemplo, puede utilizarse para sumar enteros o para sumar
flotantes. La resolucin de la sobrecarga por parte del sistema Haskell se basa en
organizar los diferentes tipos en lo que se denominan clases de tipos.
Considrese el operador de comparacin (==). Existen muchos tipos cuyos
elementos pueden ser comparables, sin embargo, los elementos de otros tipos
podran no ser comparables. Por ejemplo, comparar la igualdad de dos funciones
es una tarea computacionalmente intratable, mientras que a menudo se desea
comparar si dos listas son iguales. De esa forma, si se toma la definicin de la
funcin elem que chequea si un elemento pertenece a una lista:
x `elem` [] = False

Ivonne Corona Ochoa

11420 394

13

x `elem` (y:ys) = x == y || (x `elem` ys)


I
Intuitivamente el tipo de la funcin elem debera ser a->[a]->Bool. Pero esto
implicara que la funcin == tuviese tipo a->a->Bool. Sin embargo, como ya se ha
indicado, interesara restringir la aplicacin de == a los tipos cuyos elementos son
comparables.
Adems, aunque == estuviese definida sobre todos los tipos, no sera lo mismo
comparar la igualdad de dos listas que la de dos enteros.
Las clases de tipos solucionan ese problema permitiendo declarar qu tipos son
instancias de unas clases determinadas y proporcionando definiciones de ciertas
operaciones asociadas con cada clase de tipos. Por ejemplo, la clase de tipo que
contiene el operador de igualdad se define en el estndar prelude como:
class Eq a where
(==) :: a -> a -> Bool
x == y = not (x /= y)
Eq es el nombre de la clase que se est definiendo, (==) y (/=) son dos
operaciones simples sobre esa clase. La declaracin anterior podra leerse como:
"Un tipo a es una instancia de una clase Eq si hay una operacin (==) definida
sobre l".
La restriccin de que un tipo a debe ser una instancia de una clase Eq se escribe
Eq a.
Obsrvese que Eq a no es una expresin de tipo sino una restriccin sobre el tipo
de un objeto a (se denomina un contexto). Los contextos son insertados al
principio de las expresiones de tipo. Por ejemplo, la operacin == sera del tipo:
(==):: (Eq a) => a -> a -> Bool

Ivonne Corona Ochoa

11420 394

14

Esa expresin podra leerse como: "Para cualquier tipo a que sea una instancia de
la clase Eq, == tiene el tipo a->a->Bool".
La restriccin se propagara a la definicin de elem que tendra el tipo:
elem:: (Eq a) => a -> [a] -> Bool
Las declaraciones de instancias permitirn declarar qu tipos son instancias de
una determinada clase.
Por ejemplo:
instance Eq Int where
x == y = intEq x y
La definicin de == se denomina mtodo. IntEq es una funcin primitiva que
compara si dos enteros son iguales, aunque podra haberse incluido cualquier otra
expresin que definiese la igualdad entre enteros. La declaracin se leera como:
"El tipo Int es una instancia de laclase Eq y el mtodo correspondiente a la
operacin == se define como ...".
De la misma forma se podran crear otras instancias:
instance Eq Float where
x == y = FloatEq x y
La declaracin anterior utiliza otra funcin primitiva que compara flotantes para
indicar cmo comparar elementos de tipo Float. Adems, se podran declarar
instancias de la clase Eq tipos definidos por el usuario. Por ejemplo, la igualdad
entre elementos del tipo rbol definido anteriormente:
instance (Eq a) => Eq (Arbol a) where
Hoja a == Hoja b = a == b
Rama i1 d1 == Rama i2 d2 = (i1==i2) && (d1==d2)
_ == _ = False

Ivonne Corona Ochoa

11420 394

15

Obsrvese que el contexto (Eq a) de la primera lnea es necesario debido a que


los elementos de las hojas son comparados en la segunda lnea. La restriccin
adicional est indicando que slo se podr comparar si dos rboles son iguales
cuando se puede comparar si sus hojas son iguales.
El standar prelude incluye un amplio conjunto de clases de tipos. De hecho, la
clase Eq est definida con una definicin ligeramente ms larga que la anterior.
class Eq a where
(==), (/=) :: a->a->Bool
x /= y = not (x == y)

Se incluyen dos operaciones, una para igualdad (==) y otra para no igualdad (/=).
Se puede observar la utilizacin de un mtodo por defecto para la operacin (/=).
Si se omite la declaracin de un mtodo en una instancia entonces se utiliza la
declaracin del mtodo por defecto de su clase. Por ejemplo, las tres instancias
anteriores podran utilizar la operacin (/=) sin problemas utilizando el mtodo por
defecto (la negacin de la igualdad).
Haskell tambin permite la inclusin de clases. Por ejemplo, podra ser interesante
definir una clase
Ord que hereda todas las operaciones de Eq pero que, adems tuviese un
conjunto nuevo de operaciones:
class (Eq a) => Ord a where
(<), (<=), (>=), (>) :: a->a->Bool
max, min :: a->a->a
El contexto en la declaracin indica que Eq es una superclase de Ord (o que Ord
es una subclase de Eq), y que cualquier instancia de Ord debe ser tambin una
instancia de Eq.
Las inclusiones de clase permiten reducir el tamao de los contextos: Una
expresin de tipo para una funcin que utiliza operaciones tanto de las clases Eq
como Ord podra utilizar el contexto (Ord a) en lugar de (Eq a,Ord a), puesto que

Ivonne Corona Ochoa

11420 394

16

Ord implica Eq. Adems, los mtodos de las subclases pueden asumir la
existencia de los mtodos de la superclase. Por ejemplo, la declaracin dee Ord
en el standar prelude incluye el siguiente mtodo por defecto:
x < y = x <=y && x/=y
Haskell tambin permite la herencia mltiple, puesto que las clases pueden tener
ms de una superclase. Los conflictos entre nombres se evitan mediante la
restriccin de que una operacin particular slo puede ser miembro de una nica
clase en un mbito determinado.
En el Standar Prelude se definen una serie de clases de tipos de propsito
general.

18.

BIBLIOGRAFA:

[1] Introduction to Functional Programming using Haskell- Richard Bird, Prentice


Hall International, 2nd Ed. New York, 1997
[2] Basic polimorphics typecheking Luca Cardelli
[3] A gentle introduction to Haskell
[4] The craft of Functional Programming Simon Thompson
[5] Introduccin al lenguaje Haskell - Jose E. Labra G.
[6] http://www.haskell.org

Ivonne Corona Ochoa

11420 394

Você também pode gostar