Sou principalmente um programador de C / C ++, o que significa que a maior parte da minha experiência é com paradigmas processuais e orientados a objetos. No entanto, como muitos programadores de C ++ sabem, o C ++ mudou de ênfase ao longo dos anos para um estilo funcional, culminando finalmente na adição de lambdas e fechamentos no C ++ 0x.
Independentemente disso, embora eu tenha uma experiência considerável em codificação em um estilo funcional usando C ++, tenho muito pouca experiência com linguagens funcionais reais, como Lisp, Haskell, etc.
Recentemente, comecei a estudar essas linguagens, porque a idéia de "sem efeitos colaterais" em linguagens puramente funcionais sempre me intrigou, especialmente no que diz respeito às suas aplicações à concorrência e à computação distribuída.
No entanto, vindo de um background em C ++, estou confuso sobre como essa filosofia de "sem efeitos colaterais" funciona com a programação assíncrona. Por programação assíncrona, entendo qualquer estilo de estrutura / API / codificação que despacha manipuladores de eventos fornecidos pelo usuário para manipular eventos que ocorrem de forma assíncrona (fora do fluxo do programa). Isso inclui bibliotecas assíncronas, como Boost.ASIO, ou até mesmo C simples manipuladores de sinal ou manipuladores de eventos da GUI Java.
A única coisa que todos eles têm em comum é que a natureza da programação assíncrona parece exigir a criação de efeitos colaterais (estado), para que o fluxo principal do programa perceba que um manipulador de eventos assíncrono foi chamado. Normalmente, em uma estrutura como Boost.ASIO, um manipulador de eventos altera o estado de um objeto, para que o efeito do evento seja propagado além do tempo de vida da função do manipulador de eventos. Realmente, o que mais um manipulador de eventos pode fazer? Ele não pode "retornar" um valor ao ponto de chamada, porque não há um ponto de chamada. O manipulador de eventos não faz parte do fluxo principal do programa; portanto, a única maneira de afetar o programa real é alterar algum estado (ou longjmp
outro ponto de execução).
Parece que a programação assíncrona tem a ver com a produção assíncrona de efeitos colaterais. Isso parece completamente em desacordo com os objetivos da programação funcional. Como esses dois paradigmas são reconciliados (na prática) em linguagens funcionais?