Promoci n Numrica Jos Manuel Corts Lpez Programacin

  • Slides: 16
Download presentation
Promoció n Numérica José Manuel Cortés López Programación Declarativa Avanzada

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

Índice n Problema a resolver n Ejemplo del problema n Soluciones n Implementación en

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

Problema a resolver Vamos a considerar el problema de recoger los valores devueltos por

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.

Ejemplo del problema La función sumar: Queremos construir una función que devuelva la suma

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 2 + 4. 0 = 6. 0 2. 0 + 7. 0 = 9. 0

Primera solución Podemos salir del paso forzando a que se devuelvan valores de los

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. ¿ 2 + 3 = 5. 0 ?

Una solución mas elegante Otra solución es que las expresiones estén definidas en término

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.

Una solución mas elegante II Para que esta última idea sea posible, debemos incorporar

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.

Una solución mas elegante III En general, la promoción solo es una reinterpretación del

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.

¿Cómo se hace esto? Para que esta última idea sea posible, debemos incorporar al

¿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.

Como lo implementa Haskell I El Prelude y las librerías proporcionan varias funciones sobrecargadas

Como lo implementa Haskell I El Prelude y las librerías proporcionan varias funciones sobrecargadas que pueden utilizarse para la promoción explícita: from. Integer from. Rational to. Integer to. Rational from. Integral from. Real. Frac : : (Num a) => Integer -> a : : (Fractional a) => Rational -> a : : (Integral a) => a -> Integer : : (Real. Frac a) => a -> Rational : : (Integral a, Num b) => a -> b : : (Real. Frac a, Fractional b) => a -> b = from. Integer. to. Integer = from. Rational. to. Rational Escribir un numero flotante (con un punto decimal) es visto como una aplicación de from. Rational 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.

Como lo implementa Haskell II En la siguiente imagen vemos la jerarquía de clases

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.

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

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

Revisión del concepto Por ello surge el concepto de promoción numérica, y viene a

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:

Ejemplo de implementación Entonces cabe plantearse, ¿Cómo está definida esa división? Para conocer la

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:

Conclusiones La promoción numérica acerca mucho más los lenguajes de programación a la concepción

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.

Bibliografía n Blas C. Ruiz Jiménez, Francisco Gutiérrez López, etc. , Razonando con Haskell.

Bibliografía n 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. n Tutorial Haskell 98, A Gentle Introduction to Haskell, Version 98, link sobre numbers. n http: //www. info. uni- karlsruhe. de/~sather/sk 14/node 41. html