Sono principalmente un programmatore C / C ++, il che significa che la maggior parte della mia esperienza è con paradigmi procedurali e orientati agli oggetti. Tuttavia, come molti programmatori C ++ sono consapevoli, C ++ ha spostato l'accento nel corso degli anni verso uno stile funzionale, culminando infine nell'aggiunta di lambda e chiusure in C ++ 0x.
Indipendentemente da ciò, mentre ho una notevole esperienza nella codifica in uno stile funzionale con C ++, ho pochissima esperienza con linguaggi funzionali reali come Lisp, Haskell, ecc.
Recentemente ho iniziato a studiare questi linguaggi, perché l'idea di "nessun effetto collaterale" in linguaggi puramente funzionali mi ha sempre intrigato, specialmente per quanto riguarda le sue applicazioni alla concorrenza e al calcolo distribuito.
Tuttavia, provenendo da uno sfondo C ++, sono confuso su come questa philsophy "senza effetti collaterali" funzioni con la programmazione asincrona. Per programmazione asincrona si intende qualsiasi stile framework / API / coding che invii i 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 semplicemente vecchio C gestori di segnale o gestori di eventi GUI Java.
L'unica cosa che tutti hanno in comune è che la natura della programmazione asincrona sembra richiedere la creazione di effetti collaterali (stato), in modo che il flusso principale del programma diventi consapevole del fatto che è stato richiamato un gestore di eventi asincrono. Tipicamente, in un framework come Boost.ASIO, un gestore di eventi modifica lo stato di un oggetto, in modo che l'effetto dell'evento venga propagato oltre la durata della funzione del gestore di eventi. In realtà, che altro può fare un gestore di eventi? Non può "restituire" un valore al punto di chiamata, poiché non vi è alcun 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 è quello di modificare alcuni stati (oppure longjmp
in un altro punto di esecuzione).
Quindi sembra che la programmazione asincrona riguardi in modo asincrono la produzione di effetti collaterali. Questo sembra completamente in disaccordo con gli obiettivi della programmazione funzionale. In che modo questi due paradigmi sono riconciliati (in pratica) in linguaggi funzionali?