Programacion

Solo disponible en BuenasTareas
  • Páginas : 38 (9387 palabras )
  • Descarga(s) : 0
  • Publicado : 27 de abril de 2011
Leer documento completo
Vista previa del texto
3.- Lenguaje Haskell
3.1.-Conceptos básicos
El entorno HUGS funciona siguiendo el modelo de una calculadora en el que se establece una sesión interactiva entre el ordenador y el usuario. Una vez arrancado, el sistema muestra un prompt "?" y espera a que el usuario introduzca una expresión (denominada expresión inicial y presione la tecla <RETURN>. Cuando la entrada se ha completado, elsistema evalúa la expresión e imprime su valor antes de volver a mostrar el prompt para esperar a que se introduzca la siguiente expresión.
Ejemplo:
? (2+3)*8
40
? sum [1..10]
55
En el primer ejemplo, el usuario introdujo la expresión "(2+3)*8" que fue evaluada por el sistema imprimiendo como resultado el valor "40".
En el segundo ejemplo, el usuario tecleó "sum [1..10]". La notación [1..10]representa la lista de enteros que van de 1 hasta 10, y sum es una función estándar que devuelve la suma de una lista de enteros. El resultado obtenido por el sistema es:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
En los ejemplos anteriores, se utilizaron funciones estándar, incluidas junto a una larga colección de funciones en un fichero denominado "estándar prelude" que es cargado al arrancarel sistema. Con dichas funciones se pueden realizar una gran cantidad de operaciones útiles. Por otra parte, el usuario puede definir sus propias funciones y almacenarlas en un fichero de forma que el sistema pueda utilizarlas en el proceso de evaluación. Por ejemplo, el usuario podría crear un fichero fichero.hs con el contenido:
cuadrado::Integer -> Integer
cuadrado x = x * xmenor::(Integer, Integer) -> Integer
menor (x,y) = if x <= y then x else y
Para poder utilizar las definiciones anteriores, es necesario cargar las definiciones del fichero en el sistema. La forma más simple consiste en utilizar el comando ":load":
? :l fichero.hs
Reading script file "fichero.hs"
. . .
?
Si el fichero se cargó con éxito, el usuario ya podría utilizar la definición:
Introducciónal lenguaje Haskell
12
? cuadrado (3+4)
49
? cuadrado (menor (3,4))
9
Es conveniente distinguir entre un valor como ente abstracto y su representación, un expresión formada por un conjunto de símbolos. En general a un mismo valor abstracto le pueden corresponder diferentes representaciones. Por ejemplo, 7+7, cuadrado 7, 49, XLIX (49 en números romanos), 110001 (en binario) representan elmismo valor. El proceso de evaluación consiste en tomar una expresión e ir transformándola aplicando las definiciones de funciones (introducidas por el programador o predefinidas) hasta que no pueda transformarse más. La expresión resultante se denomina representación canónica y es mostrada al usuario. En el proceso de evaluación pueden seguirse diversas trayectorias, por ejemplo:
cuadrado (3+4)
={ evaluando la suma }
cuadrado 7
= { utilizando la definición cuadrado x = x * x }
7 * 7
= { evaluando la multiplicación }
49
En el ejemplo anterior se evaluaron primero las expresiones internas antes de la aplicación de
la función. Otra posibilidad sería utilizar la definición de la función antes de evaluar los
argumentos.
cuadrado (3+4)
= { utilizando la definición cuadrado x = x * x }(3+4) * (3+4)
= { evaluando la parte izquierda de la multiplicación }
7 * (3+4)
= { evaluando la parte derecha de la multiplicación }
7 * 7
= { evaluando la multiplicación }
49
El primer esquema, evaluar los argumentos antes de llamar a la función, se denomina llamada
por valor y se asocia con la evaluación ansiosa. El segundo se denomina llamada por nombre
y está asociado a laevaluación perezosa. En algunas ocasiones, la llamada por valor puede no
terminar, mientras que la llamada por nombre sí. Por ejemplo, si se carga el siguiente
programa:
infinito:: Integer
infinito = infinito + 1
tres:: Integer -> Integer
tres x = 3
Al evaluar la expresión "tres infinito" por valor se obtiene:
Introducción al lenguaje Haskell
13
tres infinito
= { utilizando la definición...
tracking img