La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

José Manuel Cortés López Programación Declarativa Avanzada

Presentaciones similares


Presentación del tema: "José Manuel Cortés López Programación Declarativa Avanzada"— Transcripción de la presentación:

1 José Manuel Cortés López Programación Declarativa Avanzada
Promoción Numérica José Manuel Cortés López Programación Declarativa Avanzada

2 Índice Problema a resolver Ejemplo del problema Soluciones
Implementación en Haskell Revisión del concepto Conclusiones Bibliografía

3 Problema a resolver Vamos a considerar el problema de recoger los valores devueltos por una función numérica y asignarlos a los correspondientes tipos que representen los dominios correctos de esos valores. Decidir el tipo de los valores devueltos por una función no es trivial, y mucho menos si esto ha de hacerlo el sistema cuando se encuentra ejecutando la función.

4 Ejemplo del problema La función sumar:
Queremos construir una función que devuelva la suma de dos números cualesquiera. Hay que considerar que los tipos de los argumentos pueden ser distintos, y además el valor devuelto por la función puede ser distinto según los valores de los argumentos. 2 + 3 = 5 = 6.0 = 9.0

5 Primera solución Podemos salir del paso forzando a que se
devuelvan valores de los tipos que consideremos, aunque sabemos que esta medida no se corresponde con lo que deseamos realmente. ¿ = 5.0 ?

6 Una solución mas elegante
Otra solución es que las expresiones estén definidas en término de unas clases más generales y sea el compilador quien decida a que subclase numérica pertenece. Éstas clases generales son apropiadas para hacer corresponder los tipos de la función sin crear ningún tipo de ambigüedad.

7 Una solución mas elegante II
Para que esta última idea sea posible, debemos incorporar al lenguaje no sólo esos tipos generales de números que engloban a los ya existentes, sino una serie de funciones que indiquen el tipo procedente de un dato, así como la conversión de un dato de un tipo determinado a otro.

8 Una solución mas elegante III
En general, la promoción solo es una reinterpretación del valor dado en el ámbito de un tipo general. Un valor numérico de un tipo, incluyendo los tipos numéricos universales, puede promocionar a otro tipo numérico convirtiendo los valores enteros a punto flotante y adaptando la longitud si es necesario. El redondeo de números en punto flotante a flotantes de baja precisión o a enteros debe ser siempre especificado por operaciones explícitas.

9 ¿Cómo se hace esto? Para que esta última idea sea posible,
debemos incorporar al lenguaje no sólo esos tipos generales de números que engloban a los ya existentes, sino una serie de funciones que indiquen el tipo procedente de un dato, así como la conversión de un dato de un tipo determinado a otro.

10 Como lo implementa Haskell I
El Prelude y las librerías proporcionan varias funciones sobrecargadas que pueden utilizarse para la promoción explícita:   fromInteger         :: (Num a) => Integer -> a      fromRational       :: (Fractional a) => Rational -> a      toInteger           :: (Integral a) => a -> Integer      toRational          :: (RealFrac a) => a -> Rational      fromIntegral       :: (Integral a, Num b) => a -> b      fromRealFrac     :: (RealFrac a, Fractional b) => a -> b      fromIntegral        = fromInteger . toInteger      fromRealFrac        = fromRational . toRational Escribir un numero flotante (con un punto decimal) es visto como una aplicación de fromRational al valor del número como Rational. Es decir, 7 tiene el tipo (Num a) = > a, y 7.3 tiene el tipo (Fractional a) => a.

11 Como lo implementa Haskell II
En la siguiente imagen vemos la jerarquía de clases que están definidas en Haskell y podemos apreciar como el tipo numérico (Num) representa a los números en general.

12 ¿Lo incorporan realmente los lenguajes de programación?
Ejemplos sobre Haskell, Prolog, Java, Lisp.

13 Revisión del concepto Por ello surge el concepto de promoción numérica, y viene a decir básicamente que una función puede estar descrita en términos de unas clases numéricas que van a estar sobrecargadas, por eso cuando realizamos la siguiente operación:

14 Ejemplo de implementación
Entonces cabe plantearse, ¿Cómo está definida esa división? Para conocer la definición tecleamos la directiva de búsqueda en Hugs (:f +) y nos conduce directamente hasta la definición del módulo de definiciones básicas del programa. Obtenemos el siguiente resultado:

15 Conclusiones La promoción numérica acerca mucho más los
lenguajes de programación a la concepción humana de los cuerpos numéricos definidos en la matemática. La posibilidad de definir funciones sobre esa jerarquía de conjuntos numéricos facilita la comprensión del lenguaje y hace más eficiente la tarea de codificar ciertas funciones matemáticas.

16 Bibliografía Blas C. Ruiz Jiménez, Francisco Gutiérrez López, etc., Razonando con Haskell. Una introducción a la programación funcional, manual de la universidad, año 2000. Tutorial Haskell 98, A Gentle Introduction to Haskell, Version 98, link sobre numbers.


Descargar ppt "José Manuel Cortés López Programación Declarativa Avanzada"

Presentaciones similares


Anuncios Google