Академический Документы
Профессиональный Документы
Культура Документы
4 Disciplina de Tipos
En los lenguajes de programación con disciplina de tipos, cada tipo representa una
colección de valores (datos) similares. Una función cuyo tipo sea A1 -> ... An ->
espera n parámetros con tipos A1, ... An y devuelve un resultado de tipo R. El
conocer los tipos de las funciones ayuda a documentar los programas y a evitar
errores en tiempo de ejecución.
Disciplina estática de tipos: Los programas bien tipados se pueden reconocer en
tiempo de compilación, un programa bien tipado se puede utilizar sin efectuar
comprobaciones de tipo en tiempo de ejecución. Estando garantizado que no se
producirán errores de tipo durante el cómputo.
Clases de errores
esCero x = x=0
El segundo = tenía que ser el operador == (= significa ‘se define como’ y == significa
‘es igual a’). Al analizar esta definición el intérprete dice:
Reading script file "nuevo":
Parsing...............
ERROR "nuevo" (line 18): Syntax error in input (unexpected ‘=’)
el int´erprete dice:
Reading script file "nuevo":
Parsing..............
Dependency analysis....................................
ERROR "nuevo" (line 19): Undefined variable "producto"
La subexpresón (term) 1 tiene el tipo Int (entero). No se puede sumar tal valor a
True, que es de tipo Bool.
Otros errores de tipado se producen si se aplica la función length a algo diferente
de una lista, como en length 3:
Expresiones de tipo
El tipo de una expresión se puede determinar con el comando del intérprete: type
seguido de la expresión de la que se quiere conocer el tipo. Por ejemplo:
? :type 3+4
3 + 4 :: Int
El símbolo: significa: ‘es del tipo’. La expresión no se evalúa con el comando: type,
solamente se determina el tipo.
Existen cuatro tipos estándar:
• Int: el tipo de los enteros;
• Float: el tipo de los números de punto flotante (floating-point);
• Bool: el tipo de los valores booleanos: True y False; pág. 49
• Char: el tipo de los caracteres (se tratará en el párrafo 3.2.2).
También las funciones tienen un tipo. El tipo de una función está determinado por
el tipo del parámetro y el tipo del resultado. Por ejemplo, el tipo de la función sum
es:
? :type sum
sum :: [Int] -> Int
La función sum opera sobre listas de enteros y como resultado devuelve un solo
entero. El símbolo -> en el tipo de la función representa una flecha (→). Otros
ejemplos de tipos de funciones son:
Polimorfismo
Para algunas funciones sobre listas no interesa el tipo de los elementos de la lista.
La función estándar length puede determinar el tamaño de una lista de enteros, pero
también de una lista de valores booleanos, y –por qué no– de una lista de funciones.
El tipo de la función length se define como sigue:
Este tipo indica que esta función se aplica sobre una lista, pero que el tipo de los
elementos de esta lista no importa. Este tipo se indica por medio de una variable de
tipo, en el ejemplo se utiliza la letra a. Variables de tipo se escriben con una letra
minúscula, al contrario que los tipos fijos como Int y Bool. La función head, que
devuelve el primer elemento de una lista, tiene el tipo:
Esta función se aplica también a listas, sin que importe cual sea el tipo de los
elementos. Pero su resultado es del tipo de los elementos de la lista (es el primer
elemento de la lista). Por tanto, se usa para el tipo del resultado la misma variable
que para el tipo de los elementos de la lista. Un tipo que contiene variables de tipo,
se llama tipo polimórfico. Las funciones con un tipo polimórfico se llaman funciones
polimórficas. El fenómeno en si se llama polimorfismo. Las funciones polimórficas,
como length y head, tienen en común que usan solamente la estructura de una lista.
Una función no polimórfica como sum, usa también propiedades de los elementos
de la lista (como la posibilidad de sumarlos, etc.).