lunes, 1 de noviembre de 2010

Lab de lenguajes de progra (Dr.Elisa)

 LENGUAJE HASKELL





Haskell es un lenguaje funcional puro, de propósito general, que incluye muchas de las últimas innovaciones en el desarrollo de los lenguajes de programación funcional, como son las funciones de orden superior, evaluación perezosa, tipos polimórficos estáticos, tipos definidos por el usuario, encaje por patrones, y definiciones de listas por comprehensión.

Otras características interesantes como el tratamiento sistemático de la sobrecarga, la facilidad en la definición de tipos abstractos de datos, el sistema de entrada/salida puramente funcional y la posibilidad de utilización de módulos.

Se utiliza como referencia el entorno de programación Hugs y se supone que el lector tiene unos mínimos conocimientos del modelo de programación imperativo o tradicional.

Modelo Funcional

El modelo funcional, tiene como objetivo la utilización de funciones matemáticas puras sin efectos laterales y, por tanto, sin asignaciones destructivas.

El programador se encarga de definir un conjunto de funciones sin preocuparse de los métodos de evaluación que posteriormente utilice el sistema.

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 .

Cuando la entrada se ha completado, el sistema 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


Identificadores y operadores

Existen dos formas de nombrar una función, mediante un identificador (por ejemplo, sum, product y fact) y mediante un símbolo de operador (por ejemplo, * y +)

El sistema distingue entre los dos tipos según la forma en que estén escritos:

Un identificador comienza con una letra del alfabeto seguida, opcionalmente, por una secuencia de caracteres, cada uno de los cuales es, una letra, un dígito, un apóstrofe (') o un subrayado (_).

Los identificadores que representan funciones o variables deben comenzar por letra minúscula (los identificadores que comienzan con letra mayúscula se emplearán como funciones constructoras).

Los siguientes son ejemplos de posibles identificadores:

sum f          f''           intSum             termino_10

Un símbolo de operador es escrito utilizando uno o más de los siguientes caracteres:

:    !    #   $   %   &   *   +   .   /   <   =   >   ?   @   \   ^   -

Los siguientes símbolos tienen usos especiales:

::    =  ..  @  \  <-  ->  ~   =>



Tipos.

Una parte importante del lenguaje Haskell lo forma el sistema de tipos que es utilizado para detectar errores en expresiones y definiciones de función.

El universo de valores es particionado en colecciones organizadas, denominadas tipos. Cada tipo tiene asociadas un conjunto de operaciones que no tienen significado para otros tipos, por ejemplo, se puede aplicar la función (+) entre enteros pero no entre caracteres o funciones.

Una propiedad importante del Haskell es que es posible asociar un único tipo a toda expresión bien formada. Esta propiedad hace que el Haskell sea un lenguaje fuertemente tipado. Como consecuencia, cualquier expresión a la que no se le pueda asociar un tipo es
rechazada como incorrecta antes de la evaluación.

Por ejemplo:

f x = 'A'

g x = x + f x


La expresión 'A' denota el caracter A. Para cualquier valor de x, el valor de f x es igual al caracter 'A', por tanto es de tipo Char. Puesto que el (+) es la operación suma entre números, la parte derecha de la definición de g no está bien formada, ya que no es posible aplicar (+) sobre un caracter.



Booleanos

Se representan por el tipo "Bool" y contienen dos valores: "True (verdadero)" y "False (falso)". El standar prelude incluye varias funciones para manipular valores booleanos:

(&&),(||) y not.

x && y es True si y sólo si x e y son True
x || y es True si y sólo si x ó y ó ambos son True

También se incluye una forma especial de expresión condicional que permite seleccionar entre dos alternativas dependiendo de un valor booleano:

if exp_b then x else y

Enteros

Representados por el tipo "Int", se incluyen los enteros positivos y negativos tales como el -273, el 0 ó el 383. Como en muchos sistemas, el rango de los enteros utilizables está restringido. También se puede utilizar el tipo Integer que denota enteros sin límites superior ni inferior.

En el standar prelude se incluye un amplio conjunto de operadores y funciones que manipulan enteros:

(+) suma.
(*) multiplicación.
(-) substracción.
(^) potenciación.

negate menos unario (la expresión "-x" se toma como "negate x")

div división entera " "rem resto de la división entera. Siguiendo la ley: (x `div` y)*y + (x `rem` y) == x

mod módulo, como rem sólo que el resultado tiene el mismo signo que el divisor.

odd devuelve True si el argumento es impar

even devuelve True si el argumento es par.

gcd máximo común divisor.

lcm mínimo común múltiplo.

abs valor absoluto

signum devuelve -1, 0 o 1 si el argumento es negativo, cero ó positivo, respectivamente.


Ejemplos:

8^2 == 64

7 `div` 3 == 2

Flotantes

Representados por el tipo "Float", los elementos de este tipo pueden ser utilizados para representar fraccionarios así como cantidades muy largas o muy pequeñas. Sin embargo, tales valores son sólo aproximaciones a un número fijo de dígitos y pueden aparecer errores de redondeo en algunos cálculos que empleen operaciones en punto flotante. Un valor numérico se toma como un flotante cuando incluye un punto en su representación o cuando es demasiado grande para ser representado por un entero.

También se puede utilizar notación científica; por ejemplo 1.0e3 equivale a 1000.0, mientras que 5.0e-2 equivale a 0.05.



El standar prelude incluye también múltiples funciones de manipulación de flotantes:

pi, exp, log, sqrt, sin, cos, tan, asin, acos, atan, etc.



Caracteres

Representados por el tipo "Char", los elementos de este tipo representan caracteres individuales como los que se pueden introducir por teclado. Los valores de tipo caracter se escriben encerrando el valor entre comillas simples, por ejemplo 'a',

'0', '.' y 'Z'.

Funciones

Si a y b son dos tipos, entonces a->b es el tipo de una función que toma como argumento un elemento de tipo a y devuelve un valor de tipo b.

Pueden ser argumentos o resultados de otras funciones o ser componentes de estructuras de datos.

La función suma tiene el tipo:

(+)::Int->(Int->Int)


Listas

Si a es un tipo cualquiera, entonces [a] representa el tipo de listas cuyos elementos son valores de tipo a.

Hay varias formas de escribir expresiones de listas:

- La forma más simple es la lista vacía, representada mediante [].

Se puede decir que estas notaciones son equivalentes:

[1,3,10] = 1:[3,10] = 1:(3:[10]) = 1:(3:(10:[]))


length xs devuelve el número de elementos de xs

xs ++ ys devuelve la lista resultante de concatenar xs e ys

concat xss devuelve la lista resultante de concatenar las listas de xss

map f xs devuelve la lista de valores obtenidos al aplicar la función f a
cada uno de los elementos de la lista xs.


Ejemplos:

? length [1,3,10]

3

? [1,3,10] ++ [2,6,5,7]

[1, 3, 10, 2, 6, 5, 7]


? concat [[1], [2,3], [], [4,5,6]]

[1, 2, 3, 4, 5, 6]



Cadenas

Una cadena es tratada como una lista de caracteres y el tipo "String" se toma como una abreviación de "[Char]". Las cadenas pueden ser escritas como secuencias de caracteres encerradas entre comillas dobles.

? "hola"

Hola


? length "Hola"

4                       //Aqui te dice cuantas letras tiene la palabra


Como pueden ver este lenguaje se puede decir que esta muy sencillo de aprender.

Espero y les haya servido
SALUDOS A TODOS

ATTE: JESUS ALEJANDRO BELTRAN REYNA



1 comentario: