Soy principalmente un programador de C / C ++, lo que significa que la mayor parte de mi experiencia es con paradigmas de procedimientos y orientados a objetos. Sin embargo, como saben muchos programadores de C ++, C ++ ha cambiado su énfasis a lo largo de los años a un estilo funcional, que culminó finalmente con la incorporación de lambdas y cierres en C ++ 0x.
De todos modos, aunque tengo una experiencia considerable en la codificación de un estilo funcional usando C ++, tengo muy poca experiencia con lenguajes funcionales reales como Lisp, Haskell, etc.
Recientemente comencé a estudiar estos lenguajes, porque la idea de "no tener efectos secundarios" en lenguajes puramente funcionales siempre me ha intrigado, especialmente con respecto a sus aplicaciones para la concurrencia y la computación distribuida.
Sin embargo, viniendo de un entorno de C ++, estoy confundido acerca de cómo funciona esta filosofía sin efectos secundarios con la programación asincrónica. Por programación asincrónica me refiero a cualquier estilo de marco / API / codificación que despacha controladores de eventos proporcionados por el usuario para manejar eventos que ocurren de forma asincrónica (fuera del flujo del programa). Esto incluye bibliotecas asincrónicas como Boost.ASIO, o incluso simplemente C viejo manejadores de señal o manejadores de eventos GUI Java.
Lo único que todos estos tienen en común es que la naturaleza de la programación asincrónica parece requerir la creación de efectos secundarios (estado), para que el flujo principal del programa tome conciencia de que se ha invocado un controlador de eventos asincrónico. Típicamente, en un marco como Boost.ASIO, un controlador de eventos cambia el estado de un objeto, de modo que el efecto del evento se propaga más allá del tiempo de vida de la función del controlador de eventos. Realmente, ¿qué más puede hacer un controlador de eventos? No puede "devolver" un valor al punto de llamada, porque no hay un punto de llamada. El controlador de eventos no es parte del flujo principal del programa, por lo que la única forma en que puede tener algún efecto en el programa real es cambiar algún estado (o bien longjmp
a otro punto de ejecución).
Por lo tanto, parece que la programación asincrónica se trata de producir asincrónicamente efectos secundarios. Esto parece completamente en desacuerdo con los objetivos de la programación funcional. ¿Cómo se concilian estos dos paradigmas (en la práctica) en lenguajes funcionales?