Sono principalmente un programmatore C / C ++, il che significa che la maggior parte della mia esperienza riguarda paradigmi procedurali e orientati agli oggetti. Tuttavia, come sanno molti programmatori C ++, nel corso degli anni C ++ ha spostato l'enfasi su uno stile funzionale, culminando infine con l'aggiunta di lambda e chiusure in C ++ 0x.
Indipendentemente da ciò, mentre ho una notevole esperienza nella codifica in uno stile funzionale usando C ++, ho pochissima esperienza con linguaggi funzionali reali come Lisp, Haskell, ecc.
Di recente ho iniziato a studiare questi linguaggi, perché l'idea di "nessun effetto collaterale" in linguaggi puramente funzionali mi ha sempre incuriosito, soprattutto per quanto riguarda le sue applicazioni alla concorrenza e al calcolo distribuito.
Tuttavia, proveniente da un background C ++, sono confuso su come questa filosofia "senza effetti collaterali" funzioni con la programmazione asincrona. Per programmazione asincrona intendo qualsiasi framework / API / stile di codifica che invia gestori di eventi forniti dall'utente per gestire eventi che si verificano in modo asincrono (al di fuori del flusso del programma). Ciò include librerie asincrone come Boost.ASIO o anche solo semplicemente la vecchia C gestori di segnali o gestori di eventi della GUI Java.
L'unica cosa che tutti questi hanno in comune è che la natura della programmazione asincrona sembra richiedere la creazione di effetti collaterali (stato), affinché il flusso principale del programma venga a conoscenza del fatto che è stato invocato un gestore di eventi asincrono. In genere, in un framework come Boost.ASIO, un gestore eventi modifica lo stato di un oggetto, in modo che l'effetto dell'evento venga propagato oltre la durata della funzione del gestore eventi. Davvero, cos'altro può fare un gestore di eventi? Non può "restituire" un valore al punto di chiamata, poiché non esiste un punto di chiamata. Il gestore di eventi non fa parte del flusso principale del programma, quindi l'unico modo in cui può avere un effetto sul programma effettivo è cambiare un certo stato (oppure longjmp
in un altro punto di esecuzione).
Quindi sembra che la programmazione asincrona riguardi la produzione asincrona di effetti collaterali. Questo sembra completamente in contrasto con gli obiettivi della programmazione funzionale. In che modo questi due paradigmi sono riconciliati (in pratica) con linguaggi funzionali?