@ agnasg

Post #200: hablemos de Haskell

30-01-2007 2:03 PM

Esta es la entrada número 200 en este sitio. En realidad son muchas más pero por múltiples razones todavía no he terminado de migrar toda la data de mi página anterior que estaba escrita 100% en html. Este nuevo sitio está desarrollado con WordPress y php. Una de las razones de esta lentitud es que, como se debe notar si se lee detenidamente estas páginas, yo me la paso desarrollando juegos que normalmente termino no publicando. Eso consume bastante tiempo. Creánme. Por ejemplo, en este momento estoy desarrollando un intérprete para aventuras conversacionales, y estoy desarrollando un juego usando ese interprete, como dije abajo, espero publicarlos en dos meses. Pues bien, este interprete utiliza un lenguaje que es una mezcla de C, C++ y algunas notaciones de otros lenguajes para desarrollar aventuras conversacionales tales como Inform y Hugo. Pero ha llegado el momento en que debo agregar alguna notación para programar funciones (por si al implementador de una aventura conversacional se le ocurre que necesita una función o procedimiento). Incialmente pensaba utilizar la notación, sintaxis y gramática de C, pero se me ha ocurrido que quizás deba investigar en profundidad otras posibilidades. Claro que descarté Lisp, Prolog y Schema en el primer nanosegundo, pero estos lenguajes me hicieron pensar en los lenguajes funcionales. Estos lenguajes se centran en qué se va a hacer, qué se va a calcular, no cómo hacerlo. Los que usan hojas de cálculos tienen experiencia usando un lenguaje funcional. Ahi, se especifica el valor de una celda a través de su expresión para calcularla.

Le dí un vistazo a Erlang (1), pero me pareció horrible (yo soy fanático de la elegancia). Y entonces recordé Haskell (1, 2), un lenguaje que he mantenido en observación desde hace algún tiempo y que últimamente, por cierto, ha estado de moda. Yo podría extenderme explicando las bondades de este lenguaje y su potencia, pero prefiero resumir presentando un par de ejemplos tomados de los tutoriales.

Comencemos con la definición de la longitud de un string, una función que tipicamente se llama length en la mayoría de los lenguajes (excepto en C, que en la librería standard se llama strlen ())

length :: [a] -> Integer
length [] = 0
length (x:xs) = 1 + length xs

Ups! qué demonios es eso se preguntará un programador de lenguajes imperativos (es decir de lenguajes como C, Java, etc). Es simple si entendemos la notación. La primera línea indica que la longitud de un string es un integer. ¿Lógico verdad? Bien, la segunda línea es mucho más sencilla: la longitud de un string vacio es cero. Wow!, genial, obvio, evidente, simplemente elegante. Pues aún hay más simplicidad. la tercera línea dice que la longitud de un string cuyo primer elemento es ‘x’ y el resto es ‘xs’ es 1 más la longitud de xs. ¿Genial, verdad? Sip. Simple, elegante, fácil de entender y fácil de implementar. Lisp, Prolog y otros lenguajes similares resultan igualmente simples al comienzo pero se complican rápidamente. Haskell se mantiene simple todo el tiempo. Veamos otro ejemplo. Implementemos la función quicksort (para los que no se acuerdan, es la función más eficiente para ordenar una arreglo de números).

qsort[] = []
qsort[] (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter >= x) xs)

Hmm. ¿Qué es esto? Elemental mi querido lector. El resultado de ordenar una lista vacia ‘[]’ es una lista vacía ‘[]’. Y el resultado de or
denar una lista cuyo primer elemento es ‘x’ y el resto de los elemnentos es ‘xs’ es simplemente la concatenación ‘++’ de el qsort de todos los elementos menores a x en xs (filter (=x) xs) con [x] en el medio.

En alguna parte dice que debemos (los programadores) aprender al menos un nuevo lenguaje todos los años, así que si al final no utilizo Haskell para mi interprete, al menos la experiencia de aprender a usarlo habrá sido buena.

Un enlace solitario en este post (el #200) que ha sido particularmente largo