Algo pasa con Haskell

Sin duda existe una gran cantidad de lenguajes de programación sobre los que podemos poner nuestra mirada. Sin embargo, sólo unos pocos están llamados para la gloria. Existen muchas cuestiones por las que un lenguaje debe ser elegido sobre otros, e igualmente, existen muchas situaciones diferentes que aconsejan usar unos y no otros.

Como lenguaje de propósito general que tenga una comunidad de usuarios con cierta relevancia, Haskell es de los pocos lenguajes que posee características que divergen enormemente del resto de lenguajes. En las siguientes líneas, intentaré dar mi propia y subjetiva visión del panorama actual del ecosistema Haskell, siempre desde un punto de vista práctico y pragmático, y de paso, dar unas pinceladas sobre lo que yo he podido entrever es, la programación funcional.

¿Haskell?

Haskell es un lenguaje de programación del que yo destacaría las siguientes características:

  • Es perezoso: por defecto, cualquier expresión (dentro de una definición) no es evaluada hasta que su valor es requerido. Este concepto tan simple tiene unas implicaciones enormes y realmente sorprendentes. En la práctica, éste hecho resulta en la recomendación de que el programador piense en términos de computaciones en lugar de código, de forma que quede nítidamente claro que al definir la lista [3 * 4, 6 * 5, 1 + 2] no tenemos la lista [12, 30, 3], sino tres expresiones que podrán o no estar evaluadas cuando su valor se requiera. No te dejes engañar por la simplicidad de este mecanismo y no pierdas la oportunidad de conocer intrigantes formas de sacarle partido.
  • Mantiene la transparencia referencial: cualquier expresión en Haskell cumple la transparencia referencial es decir, dada una expresión, por compleja que sea, siempre podrá ser sustituida por su valor al evaluarla. Lo anterior es equivalente a decir que cualquier expresión en Haskell siempre siempre devolverá exactamente el mismo valor y que por tanto, no está permitida no existe ninguna función que, por ejemplo, devuelva un número aleatorio o lea de disco puesto que estas dos operaciones pueden devolver valores diferentes cada vez que son evaluadas. Otra vez, puede que te resulte simple e incluso limitado, pero de nuevo esta característica te permite manipular estructuras con un nivel de abstracción sorprendente.
  • El sistema de tipos: Haskell implementa un sistema de tipos basado en el polimorfismo Hindley-Milner ampliado con un sistema de clases de tipos (Type classes) que no tiene nada que ver con las clases de la POO. Al contrario que las dos características anteriores, sencillas de entender pero con enormes implicaciones, el sistema de tipos de Haskell ni es sencillo, ni sus implicaciones son tan trascendentales (¡siéndolo!). Aun así es tal que, una vez te acostumbras a él, lo echas de menos en el resto de lenguajes. Creo que es el sistema de tipos el que da cohesión a las dos anteriores y juntas las tres, marcan una diferencia radical frente a otros lenguajes que "admiten evaluación perezosa" y "admiten transparencia referencial".

Desde un punto de vista emotivo, Haskell pudiera ser considerado como el abanderado de los lenguajes que nos prometía la serie de artículos Programación imperativa VS declarativa en su variante funcional, pero desde un punto de vista práctico, veremos en las próximas líneas que el diablo está en los detalles.

Aprendiendo Haskell

Comentan los profesores que el aprendizaje de Haskell es más suave en aquellos alumnos que nunca antes hayan tenido contacto con lenguajes de programación,

en el sentido de que los segundos adquieren "las malas costumbres y pensamientos impuros" de los lenguajes imperativos (permíteme que insista con la serie Programación imperativa VS declarativa si deseas profundizar en el tema).

Yo nunca he enseñado Haskell a nadie, por lo que sólo puedo hablar por mi mismo, pero efectivamente, cuando hace unos 4 años andaba yo hastiado de la indefectible monotonía de los lenguajes, en mi búsqueda del Santo Grial me topé con Haskell. Una disrupción mental sacudió mi cerebro y fue el reto, la dificultad, la curiosidad que me hizo elegir a éste sobre otros lenguajes candidatos (Scala, Clojure y F# en particular).

Sí, dicen que la curva de aprendizaje es más acusada en Haskell que en otros lenguajes y en mi caso así ha sido (deliciosamente acusada), pero también es cierto que, ¿no es razonable que así sea si ya tenemos deformado nuestro cerebro con estrategias imperativas?.

Ha llovido mucho desde que dejé la Universidad, pero en ellas nunca oí hablar de Haskell y tan sólo los venerables Lisp y Prolog entraban a hurtadillas en el plan de estudios. Afortunadamente parece que eso ha ido cambiando desde entonces y son varias las universidades y docentes (del que me gustaría destacar a José A. Alonso del Dpto. de Ciencias de la Computación e Inteligencia Artificial de la Universidad de Sevilla) que realizan un esfuerzo para mantener viva la plasticidad de las mentes de sus alumnos.

No te quiero engañar, a mi me resultó (y resulta) difícil, pero eso es precisamente lo que me divierte y motiva.

Haskell en las trincheras

Muchos programadores tienen lenguajes fetiche, lenguajes de los que disfrutan, pero que no los usan de forma profesional. Con frecuencia Haskell es uno de ellos.

Una vez has remontado la hercúlea pendiente y te sientes cómodo entre mónadas y functores, sería temerario usarlo profesionalmente sin antes hacerse la pregunta de si Haskell es un lenguaje útil, práctico para desarrollar nuestras soluciones.

Recientemente Gabriel Gonzalez pormenorizó el State of Haskell ecosystem de las que destacaré las que, siempre en mi opinión, son las más relevantes:

  • IDE support: a mi siempre me han gustado los IDE, desde el vetusto Turbo C de Borland, siempre he sabido apreciar las comodidades que un buen IDE suministra. Haskell adolece de una solución que pueda satisfacer, sobre todo, a aquellos que se inician en el lenguaje. Particularmente utilizo vim, porque me permite trabajar cómodamente de forma remota, emacs podría ser la alternativa adecuada y está Leksah programado en Haskell pero que no termina de enganchar. No, en mi opinión no hay una solución adecuada y debes tunearte por tu cuenta un entorno de trabajo que te resulte cómodo.
  • Standalone GUI applications: si te planteas desarrollar este tipo de aplicaciones, el problema se agudiza y deberías analizar bien la arquitectura a utilizar si tu aplicación tendrá un tamaño considerable.
  • ARM processor support: Haskell tiene soporte para Windows y Linux sobre x86_64 e i686 pero adolece de formas robustas de desarrollar para otras plataformas (en particular para Android e iOS). Si bien es cierto que es posible distribuir para todas ellas (incluidas Raspberry y Arduino).

Realmente ninguna de las anteriores tiene una gran relevancia, pero sí es cierto que sobre todo para front-end parece recomendable que si nuestro sistema va a tener un tamaño apreciable, usemos entornos con un tooling más productivo.

Mi propia conclusión es que hoy en día Haskell es una fantástica opción si tu equipo de desarrollo está capacitado y lo usas para la parte de negocio. El despliegue es trivial (más allá de tu propia arquitectura), las dependencias nulas y consumos de recursos de servidor muy ajustados.

¿Es Haskell el futuro?

Tristemente y en mi opinión, no. No creo que se vuelva mainstream a corto o medio plazo, aunque también creo que siempre será una opción apreciada y usada por muchos desarrolladores y empresas. Este hecho es un condicionante muy importante para muchos, dado que limita la cantidad de soporte y tooling respecto de otras soluciones, aun cuando proporcionalmente, en mi opinión, está notablemente por encima de otras. Por desgracia el contexto actual hace que, popularmente, las cosas negativas de Haskell tengan más peso que las positivas.

En todo caso y sin dudarlo, sea por curiosidad, porque te gustan los retos (Functional pearls) o sencillamente para tener una visión mejor de lo que significa ser programador, te recomiendo que ¡aprendas Haskell por el bien de todos!.

Ver todos los comentarios en https://www.genbeta.com

VER 0 Comentario

Portada de Genbeta