Una delle principali innovazioni in FP che ha portato alla "esplosione" di interesse è la monade.
Nel gennaio del 1992, Philip Wadler scrisse un documento intitolato L'essenza della programmazione funzionale che ha introdotto le monadi nella programmazione funzionale come modo per gestire l'IO.
Il problema principale con i linguaggi di programmazione puri, pigri e funzionali era l'utilità nel trattare con IO. È uno dei membri della "Squadra Awkward" in programmazione, perché "la pigrizia e gli effetti collaterali sono, da un punto di vista pratico, incompatibili." Se vuoi usare un linguaggio pigro, deve essere praticamente un linguaggio puramente funzionale; se vuoi usare gli effetti collaterali, è meglio usare un linguaggio rigoroso. " Riferimento
Il problema con IO prima delle monadi era che mantenere la purezza non era possibile per i programmi che erano effettivamente utili per qualcosa. Per IO, intendiamo qualsiasi cosa che riguarda il cambiamento di stato, incluso ottenere input e output dall'utente o dall'ambiente. Nella pura programmazione funzionale, tutto è immutabile, per consentire pigrizia e purezza (privo di effetti collaterali).
In che modo le monadi risolvono il problema dell'IO? Beh, senza discutere troppo delle monadi, prendono fondamentalmente il "Mondo" (l'ambiente di runtime) come input per la monade e producono un nuovo "Mondo" come output, e il risultato: tipo IO a = Mondo - > (un mondo).
FP è quindi entrato sempre più nel mainstream, perché il problema più grande, IO (e altri) è stato risolto. Come sapete, anche l'integrazione nelle lingue OO esistenti è avvenuta. LINQ è monade, per esempio, attraverso e attraverso.
Per ulteriori informazioni, consiglio di leggere le monadi e gli articoli a cui si fa riferimento nella mia risposta.