General

Haskell: Introducción (1)

Hace ya varios meses que empecé a familiarizarme con Haskell a través de algunas guías que conseguí e imprimí (en castellano, afortunadamente). Hace una semana tuve la oportunidad de comprar un libro de Paraninfo sobre Haskell y Programación Funcional en español, y trataré de compartir un poco lo que vaya saliendo de las revisiones periódicas del libro. Tomado de Wikipedia:

Haskell es un lenguaje de programación funcional e interpretado. La programación funcional es un paradigma de programación declarativa basado en la utilización de funciones matemáticas, cuyos basamentos se encuentran en la teoría Churchiana del cálculo lambda.

El objetivo es conseguir lenguajes expresivos y matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del cómputo. Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresión depende únicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos laterales.

En Debian, podemos instalar el interpretador hugs (aptitude install hugs) para practicar y también otras herramientas para compilar programas en Haskell. Hugs se arranca simplemente corriendo hugs, pero necesitaremos otro archivo .hs disponible para introducir las funciones, que no pueden ser declaradas en el interpretador.

Una función f entre dos conjuntos es una correspondencia entre el conjunto inicial (A) y el final (B), que a cada elemento del subconjunto de A denominado dominio le corresponde un elemento del subconjunto de B denominado imagen. Las funciones pueden ser de una sola variable, de varias variables, o de 0-variables, en cuyo caso se denominan funciones constantes.

En Haskell, una función se define así:
sumaCuadrados :: Integer -> Integer -> IntegersumaCuadrados x y = x * x + y * y

Donde tenemos en primer lugar el equivalente a la declaración de la función en un lenguaje estructurado (declaración de tipo), y se usa el constructor de tipo -> para declarar los tipos de los argumentos. Haskell es un lenguaje altamente tipado, pero las declaraciones de tipo son opcionales, porque Haskell trabaja con inferencia de tipos. La siguiente línea es la regla de correspondencia de la función (método de cómputo), o el equivalente a la definición de la función para trabajar con sus argumentos (parámetros formales).

Una vez dentro de hugs podemos empezar a interactuar con el interpretador analizando expresiones matemáticas sencillas (como 1+ 2, cos pi, etc.) utilizando el comando :t al principio de cada análisis para ver que tipo de datos estamos procesando. Las listas se manejan de forma similar a Perl, por ejemplo: [1..5]

Las reducciones de expresiones que en lenguajes estructurados manejaban los conceptos de asociatividad y preferencia, en Haskell se denominan simplificaciones. En cada iteración del proceso, el interpretador busca algo reducible (un redex) y lo procesa hasta que la expresión no se puede procesar más y se dice que está en forma normal. Sin embargo, cuando se presenta ambigüedad por asociatividad, Haskell siempre da preferencia a los paréntesis más exteos.

Algunas otras funciones son estrictas, es decir, solo se aplican cuando los argumentos se encuentran en forma normal. Esto ayuda a reducir la ambiguedad en el proceso de simplificación de expresiones, ambiguedad que queda disuelta debido al concepto de transparencia referencial: no importa el camino de los redexes, el resultado final no variará.

Standard

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s