Lenguaje de programacion haskell

Solo disponible en BuenasTareas
  • Páginas : 10 (2443 palabras )
  • Descarga(s) : 0
  • Publicado : 4 de octubre de 2010
Leer documento completo
Vista previa del texto
haskell - conceptos generales (iii) - concepto de enlace perezoso
Los componentes en Haskell no son evaluados hasta que se necesitan, se lo llama en enlace perezoso. Esto permite que las estructuras que contienen elementos, los cuales al ser evaluados, pueden generar un error or fallar la ejecucion de un programa.
Internamente, cada campo de los datos no evaluados estan encapsulados en unaestructura comunmente referida como thunk que encapsula el computo definiendo el valor del campo. Este thunk no es ingresado hasta que el valor es necesitado. Un thunk que contiene errores (|) no afecta otros elementos de la estructura de datos. Por ejemplo, la dupla ('a',|) no afecta y es legal en Haskell. El caracter 'a' puede ser usada sin importar el otro componente de la dupla. La mayoria de loslenguajes son estrictos en vez de definirlo en el momento de necesitarlo.
Hay un numero de restricciones: el proceso toma tiempo para construir y evaluar las estructuras, y genera que el colector de basura retenga otras estructuras necesitadas por la evaluacion del thunk. Para superar este problema, el ser estricto con los flags en la declaracion de los datos permite que los campos especificos deun constructor para ser evaluado inmediatamente. Un campo marcado por ! en una declaracion de datos es evaluado cuando la estructura es creada en vez de retrasar su creacion en el thunk. En que casos conviene utilizar este recurso?. Algunos ejemplos:
• Componentes que se esta seguro que seran evaluados en algun punto durante el programa de ejecucion.
• Componentes que son simples de evaluar ynunca causan error.
• Tipos los cuales su valor indefinido parcialmente no afectan el flujo del programa bajo ninguna circunstancia.
Un ejemplo:
data RealFloat a => Complex a = !a :+ !a
Esta definicion marca los dos componentes, la parte real y la parte imaginaria, de los numeros complejos debe existir en todos los casos.
Esta expresion representa una manera compacta de definicion de un numerocomplejo pero en este caso viene con el costo de hacer un numero complejo sin ningun componente indefinido. Como un numero complejo se define unicamente con una dupla real,imaginaria es necesario forzar esa representacion de entrada.
El flag ! solo puede aparecer en la declaracion de datos.

Haskell - Tipos y Overloading

En el mundo de la programacion, el polimorfismo se puede categorizaren dos grupos:
- El polimorfismo parametrico. Que es el mas usado en la programacion imperativa.
- El polimorfismo AD-HOC, conocido tambien como overloading (seria sobrecarga). Un ejemplo clasico del polimorfismo AD-HOC seria por ejemplo los operadores matematicos.
El operador +, por ejemplo sirve para sumar numeros o concatenar cadenas. E incluso en el caso de la suma, el comportamiento puedeser distinto entre numeros enteros, punto flotante o incluso irracionales. Otro caso comun es el operador de '==' (igual) que permite comparar diferentes categorias de objetos.
Debido a que Haskell es un lenguaje de programacion con un fuerte control de tipado, el polimorfismo parametrico no realiza un control real del tipo (incluso si el lenguaje maneja jerarquia de clases puede llegar a serimposible saber el tipo de un objeto en tiempo de ejecucion). Por lo tanto Haskell maneja polimorfismo ad-hoc y sobrecarga para un control del tipado.
Comencemos analizando el operador de igualdad o ==. Para eso sobrecargare el operador utilizando la siguiente linea:
class Eq a where
(==) :: a -> a -> Bool
Esto se lee de la siguiente manera:
El tipo a es una instancia de la clase Eq si existe unaoperacion (sobrecargada) ==, del tipo apropiado definido. Eq no es una expresion de tipo sino que exige una restriccion de tipo.
Veamos la siguiente expresion:
(==) :: (Eq a) => a -> a -> Bool
Esto se lee de la siguiente manera: "Por cada tipo a que sea instancia de la clase Eq, == (la igualdad) tiene el tipo a->a->Bool"
elem :: (Eq a) => a -> [a] -> Bool
Y esto se lee de la siguiente...
tracking img