PureScript es un lenguaje de programación fuertemente tipado y puramente funcional que se transpiló originalmente a JavaScript, aunque actualmente cuenta con backends alternativos para C++11, Erlang y Go. Gracias a su diseño, permite el desarrollo de aplicaciones web, aplicaciones de servidor y aplicaciones de escritorio (utilizando Electron o compiladores de C++11 y Go con las librerías adecuadas).
Historia y Origen
PureScript fue diseñado inicialmente por Phil Freeman en 2013. El proyecto surgió de la insatisfacción de Freeman con los intentos previos de transpilar Haskell a JavaScript, como Fay, Haste o GHCJS. Desde entonces, el lenguaje ha sido adoptado por la comunidad y su desarrollo se centraliza en GitHub.
Para apoyar el ecosistema, la comunidad ha desarrollado herramientas esenciales como:
- Pulp: Una herramienta de construcción dedicada.
- Pursuit: Un directorio de documentación.
- Spago: El gestor de paquetes oficial.
Características Principales
PureScript se distingue por su implementación de la evaluación estricta, estructuras de datos persistentes e inferencia de tipos. Su sistema de tipos comparte similitudes con lenguajes como Haskell, incluyendo:
- Tipos de datos algebraicos y coincidencia de patrones (pattern matching).
- Tipos de orden superior (higher kinded types).
- Clases de tipos y dependencias funcionales.
- Polimorfismo de rango superior.
Innovaciones en el Sistema de Tipos
A diferencia de Haskell, PureScript introduce el polimorfismo de filas y los registros extensibles. Sin embargo, no soporta algunas características avanzadas de Haskell, como los tipos de datos algebraicos generalizados (GADT) o las familias de tipos.
Interoperabilidad y Desarrollo
Los transpiladores de PureScript buscan generar código legible siempre que sea posible. A través de una interfaz de funciones foráneas (FFI), el lenguaje permite reutilizar código existente en JavaScript, C++11 y Go.
Además, PureScript soporta la compilación incremental y ofrece plug-ins para editores populares como Vim, Emacs, Sublime Text, Atom y Visual Studio Code. Una de sus funciones más destacadas es el desarrollo guiado por tipos mediante agujeros tipados (typed holes), que permite construir programas con subexpresiones faltantes que el transpilador infiere y reporta al usuario.
