Download Promoción Numérica en Haskell

Document related concepts

Haskell wikipedia , lookup

Mónada (programación funcional) wikipedia , lookup

Miranda (lenguaje de programación) wikipedia , lookup

Tipo de dato algebraico wikipedia , lookup

Búsqueda de patrones wikipedia , lookup

Transcript


José Manuel Cortés López
Programación Declarativa Avanzada
Índice
 Problema a resolver
 Ejemplo del problema
 Soluciones
 Implementación en Haskell
 Revisión del concepto
 Conclusiones
 Bibliografía
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
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 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 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 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 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 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 que
pueden utilizarse para la promoción explícita:
fromInteger
fromRational
toInteger
toRational
fromIntegral
fromRealFrac
fromIntegral
fromRealFrac
:: (Num a) => Integer -> a
:: (Fractional a) => Rational -> a
:: (Integral a) => a -> Integer
:: (RealFrac a) => a -> Rational
:: (Integral a, Num b) => a -> b
:: (RealFrac a, Fractional b) => a -> b
= fromInteger . toInteger
= 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.
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?
 Ejemplos sobre Haskell, Prolog, Java, Lisp.
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 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
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
 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.
 http://www.info.uni-
karlsruhe.de/~sather/sk14/node41.html