¿Por qué debería usar Haskell para crear una aplicación web? Las aplicaciones web comunes toman texto de un cuadro, lo colocan en una base de datos y luego lo colocan dentro de otro cuadro. ¿Por qué elegiría un idioma que intente evitar los efectos secundarios?

Haskell no intenta evitar los efectos secundarios tanto como controlarlos . Esencialmente, esto significa que Haskell es bueno en la gestión del estado. En Haskell, evita usar el estado para controlar el flujo u organizar su programa, pero aún puede usar fácilmente el estado si es con lo que está modelando o trabajando. Esto significa que Haskell es perfectamente bueno para cosas como administrar una capa de persistencia (por ejemplo, una base de datos).

Por lo tanto, obtendría todas las ventajas normales que obtiene de Haskell: código expresivo, rendimiento relativamente bueno, facilidad de mantenimiento, etc. Esta es una gran ventaja para escribir las partes lógicas genéricas de su aplicación web.

También hay algunas ventajas específicas de desarrollo web. Puede usar el sistema de tipos para evitar errores comunes en las aplicaciones web. Eche un vistazo a Yesod Web Framework para Haskell, por ejemplo. Entre otras cosas, utilizan el sistema de tipos para garantizar que los enlaces internos nunca se rompan y para evitar vulnerabilidades de inyección SQL.

También tiene la ventaja del nuevo subsistema IO de Haskell. Si bien muchas personas parecen pensar que Haskell es malo en IO, esto simplemente no es cierto. En todo caso, Haskell hace que trabajar con IO sea más fácil que en otros idiomas. Para la programación web, obtienes el rendimiento de un sistema asíncrono basado en eventos (como Node.js) sin tener que escribir código asíncrono basado en eventos: solo puedes usar los hilos verdes extremadamente ligeros de Haskell. El tiempo de ejecución luego usa kqueue o epoll para administrar sus hilos verdes. Estos también se pueden asignar a múltiples subprocesos del sistema operativo, por lo que es trivial usar múltiples núcleos. Este sistema puede escalar fácilmente a millones de hilos y millones de conexiones de red concurrentes.

Haskell también es un lenguaje muy flexible sin mucha repetitiva. Yesod aprovecha al máximo esto, presentándole algunas DSL muy útiles para el desarrollo web. Esto facilita la especificación de elementos como plantillas y esquemas de bases de datos en Haskell, al tiempo que conserva las ventajas de la verificación de tipos.

Entonces, con un marco web como Yesod, Haskell no solo es bueno para las partes lógicas genéricas de su programa, sino que también tiene algunas ventajas específicas para la programación web. Ofrece un mejor rendimiento, más expresividad y algunas características agradables de seguridad y robustez. Hay algunos otros marcos como Snap y Happstack, pero Yesod es el único con el que estoy familiarizado.

Como ejemplo, Yesod se utilizó para construir la Escuela de Haskell [1], y las personas que trabajan en ese proyecto estaban extremadamente satisfechas con él.

[1]: la escuela de Haskell se vuelve beta

Casualmente, la Escuela de Haskell es el lugar perfecto para aprender sobre Haskell, Yesod y hacer aplicaciones web. Tienen un soporte innovador para experimentar con las tecnologías y algunos tutoriales específicos para el desarrollo web.

Haskell es más atractivo para los servicios web que las “aplicaciones web” per se. En relación con Ruby o Python, Haskell ofrece un mejor uso de los recursos y un mejor control sobre la tasa de defectos. Cuando está creando servicios web con otros componentes de su aplicación, esa compensación puede valer la pena. Hemos visto a Scala aparecer en este rol en los últimos años en algunas compañías web notables, como Twitter.

Una de las mayores ventajas de Haskell es su sistema de tipos. Si nunca ha escrito software bajo las riendas de un sistema de tipo tan expresivo (y estricto), puede ser difícil comprender cuán útil es a largo plazo.

Como ejemplo trivial, ¿cuántas veces ha visto una función escrita de forma descuidada en un lenguaje dinámico que se supone que devuelve, digamos, una cadena, pero que devuelve aleatoriamente algo como -1 en caso de falla? Se podría decir que es una programación pobre, pero veo cosas como esta todo el tiempo, incluso en el código de producción. Esto es literalmente imposible en Haskell sin incorporar explícitamente la condición de falla en la firma de tipo de la función (por ejemplo, Maybe String), que luego obliga a todo el código que consume la salida de esta función a tener en cuenta también la condición de falla (por lo que no accidentalmente olvídalo en alguna rama oscura del código, porque si lo haces, el código simplemente no se compilará).

Hay un dicho sobre Haskell que dice que si se compila, entonces probablemente sea correcto. No sé qué tan cierto es eso realmente, pero definitivamente tiene una probabilidad mucho mayor de tener razón que, por ejemplo, algún código en un lenguaje dinámico que no se cuelga en el lanzamiento. Hay clases enteras de errores que simplemente no sucederán en Haskell. En una aplicación web en la que puede insertar código en vivo en el sitio y obtener miles (o incluso millones) de visitas, puede reducir mucho el estrés sabiendo que su código ha sido sometido a estrictas verificaciones estáticas.

Además, como otros han mencionado, Haskell es más que competente para tratar con el estado. Es un error pensar que un lenguaje funcional debe evitar completamente el estado. La única diferencia es que el estado se formaliza y se hace explícito en un lenguaje puramente funcional. En realidad, esto puede hacer que sea mucho más fácil de administrar a largo plazo, a cambio de un esfuerzo adicional al principio.

Como entusiasta entusiasta de Haskell, levantaría una ceja si me dijeras que estás usando Haskell para escribir una aplicación web. Como soy un gran fanático de los lenguajes funcionales / declarativos, todavía soy consciente de que existe la herramienta adecuada para el trabajo, y Haskell definitivamente no es la herramienta adecuada para este trabajo.

Mi preocupación más importante al usar Haskell de esta manera sería la escalabilidad: a medida que mi aplicación web se usa cada vez más a menudo, tendré que comenzar a administrar cuidadosamente el acceso a la base de datos, y la pereza al hacerlo solo se interpondrá en el camino. Terminaría forzando demasiadas cosas para evaluar estrictamente, y mi ajuste de rendimiento será demasiado pesado para rastrear lugares que he olvidado hacer.
Si estoy obligando a que todo sea estricto y el 80% del código está en el IO mónada, eso significa que estoy luchando con el lenguaje, y esa es una señal segura de que debería estar usando otra cosa.

Las únicas cosas que puedo pensar que me obligarían a escribir una aplicación web en Haskell son:

  • las demandas de un gerente de producto cuya ignorancia sobre decisiones de implementación como esta solo es superada por su ira (aunque probablemente tendría que estar bastante desesperado por seguir trabajando para esa compañía)
  • curiosidad / entretenimiento mórbido, es decir, la misma razón por la que uno podría intentar escribir un programa significativo en INTERCAL o Malbolge

No estoy seguro de que la pregunta tenga sentido. Algunas aplicaciones web necesitan mantener el estado para realizar un trabajo útil porque el Protocolo de transferencia de hipertexto (HTTP) no tiene estado. En lugar de decir que Haskell intenta evitar los efectos secundarios, sería más preciso decir que Haskell obliga al programador a hacer explícitas las operaciones de efectos secundarios en el sistema de tipos. Nada de esto tiene nada que ver con el lenguaje (suponiendo que Turing-completeness) se utiliza para codificar la aplicación web.