Una delle principali innovazioni in FP che ha provocato la "esplosione" di interesse sono le monadi.
Nel gennaio del 1992, Philip Wadler scrisse un articolo intitolato L'essenza della programmazione funzionale che introduceva le monadi nella programmazione funzionale come un modo per gestire l'IO.
Il problema principale con linguaggi di programmazione puri, pigri e funzionali era l'utilità nel trattare l'IO. È uno dei membri della "Squadra Awkward" nella programmazione, perché "la pigrizia e gli effetti collaterali sono, dal punto di vista pratico, incompatibili. Se si desidera utilizzare 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 il mantenimento della purezza non era possibile per i programmi che erano effettivamente utili per qualsiasi cosa. Per IO intendiamo tutto ciò 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 (senza effetti collaterali).
In che modo le monadi risolvono il problema dell'IO? Bene, senza discutere troppo delle monadi, fondamentalmente prendono il "Mondo" (l'ambiente di runtime) come input per la monade e producono un nuovo "Mondo" come output, e il risultato: digitare IO a = Mondo -> (a, Mondo).
FP è quindi entrato sempre più nel mainstream, perché il problema più grande, IO (e altri) è stato risolto. Anche l'integrazione nelle lingue OO esistenti è avvenuta, come sapete. LINQ è monadi, ad esempio, fino in fondo.
Per maggiori informazioni, raccomando di leggere delle monadi e dei documenti citati nella mia risposta.