Escolar Documentos
Profissional Documentos
Cultura Documentos
1.
HISTORIA DE HASKELL
11420 394
2.
INTRODUCCION
3.
QU ES HASKELL?
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.
11420 394
5.
6.
FUTURO DE HASKELL
seguir
funcionando
aunque
se
aadan
clases de
tipos
con
multiparmetros,
universales, etc.
por
11420 394
ejemplo
el
diseo
sido
de
cuantificaciones locales y
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
11420 394
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.
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
11420 394
De
hecho,
no
es
necesario
denotar
la
10.
11.
LISTAS
derecha,
de
forma
operador
11420 394
(:)
es
asociativo
devuelve la lista
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
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. -
11420 394
11
15.
-TIPOS RECURSIVOS
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
11420 394
13
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
11420 394
15
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
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:
11420 394