Haskell y la Programación Funcional

Despues de tanto tiempo sin postear debido al trabajo y estudios. Mi blog ya estaba llenándose de polvo. Pues hoy quiero hablar brevemente de lo que estoy estudiando en la Universidad: Haskell y Programación Funcional (P.F)

La P.F es un paradigma de programación que se basa en el uso de funciones matemáticas para resolver problemas. Algunos lenguajes de programación funcional son Lisp (El más popular aun usado por muchos programadores) , Scheme, AP, Haskell y Miranda.

Entre las principales características de P.F tenemos:

  • Los bucles se modelan a través de la recursividad ya que no hay manera de incrementar o disminuir el valor de una variable,
  • Definición y evaluación de funciones y variables.
  • Y una cosa realmente interesante de la P.F es que las funciones son consideradas un tipo de dato primitivo. Qué significa esto?.

Primeramente, definimos a un dato primitivo como aquel que puede ser el valor de una variable, argumento de una función o valor que devuelve una función. En otros paradigmas de programación los números, caracteres y cadenas son datos primitivos, sin embargo sus funciones y procedimientos no pueden ser considerados como tal. Entonces podríamos decir que en la PF.podríamos hacer esto:

  • Una función podría tomar como argumentos otras funciones
  • Devolver un procedimiento como resultado de una llamada a otro procedimiento.
  • Tener estructuras de datos que contengan procedimientos como elementos
  • Una variable puede tener como valor un procedimien

No es esto una gran ventaja?. Solo sería cuestión que TÚ lo pruebes y juzgues por tu cuenta. En muchas univesidades e institutos del país aun se sigue enseñando paradigmas como el imperativo y orientación a objetos, pero es interesante probar nuevas cosas y apostar por el cambio.

EL L.P que estamos aprendiendo este semestre en la U es Haskell, un lenguaje funcional puro de propósito general que no goza de mucha popularidad, pero ya tiene un prestigio bien ganado, por algunas características que lo hacen elegante, eficiente y potente para resolver problemas. Más adelante entraremos en detalles.

Quisiera contar como experiencia personal que he programado en PHP desde hace casi 2 años a Ruby lo he investigado tan solo un par de meses y ahora puedo decir que con Haskell he pensado, razonado y hecho funcionar más el cerebro que con los anteriores. El nivel de abstracción, desarrollo de la lógica se producen a grandes niveles en Haskell.

Ahora vamos al grano, queremos jugar con Haskell. Tenemos varias implementaciones del lenguaje, entre las principales tenemos el intérprete HUGS y el compilador GHC. He leído en algunas listas de correo y me han recomendado usar GHC, pero bueno empezemos con algo más liviano y menos sofisticado como es Hugs para empezar a probar.

No perdamos tiempo compilando, y como Debian todo lo tiene y lo que no tiene se lo inventa solo bastaría un: sudo apt-get install hugs , Tecleamos en nuesto terminal hugs y tendremos una salida como esta:
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||—|| ___|| World Wide Web: http://haskell.org/hugs
|| || Report bugs to: hugs-bugs@haskell.org
|| || Version: 20050308 _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions

Type : ? for help
Hugs.Base>

Jejeje, sigamos , puedes editar tus programas en consola si deseas, nano, pico, vi,etc, bueno yo prefiero usar el gedit que te aclara muy bien el código. Crearemos nuestro archivo examples.hs y empezemos con un típico ejemplo, una función que me calcule el factorial de un número, tan simple como esto

fact::Int->Int
fact n
| n ==0 = 1
| otherwise = n * fact(n-1)

Recibimos un entero y que nos devuelva otro entero y usamos la recursión para hacer el cálculo. Para probarlo en nuestra consola:

ronny@mentelibre:~/haskell$ hugs examples.hs

Main> fact 5

120

Ohhhhhh que maravilla, fue solo para probar. Ahora queremos una funcion que me halle a^b editamos nuestro examples.hs

potencia::Int->Int->Int
potencia a b
| b ==0 = 1
| a ==1 = 1
| otherwise = a * potencia a (b-1)

Main> :r //para actualizar nuestro archivo y luego

Main> potencia 5 4

625

Ahora vamos a sumar todos los dígitos de determinado número:

suma::Int->Int
suma n

| n < 10 = n
| otherwise = suma(div n 10) + (mod n 10)

Actualizamos con :r y luego

Main> suma 123456789

45

Fueron ejemplos sencilllos de introducción, en los proximos posts emplearemos listas, tuplas, matrices, algoritmos de ordenación, algoritmos de búsqueda y otras cosillas que con Haskell son muy interesantes.

Gracias por tu visita al blog. Puedes seguirme en Twitter haciendo click en el siguiente enlace: