Perché tutti questi vantaggi sono anche svantaggi.
Programmi apolidi; Nessun effetto collaterale
I programmi del mondo reale sono tutti incentrati su effetti collaterali e mutazione. Quando l'utente preme un pulsante è perché vogliono che accada qualcosa. Quando scrivono qualcosa, vogliono che quello stato sostituisca qualunque stato fosse lì. Quando Jane Smith in contabilità si sposa e cambia il suo nome in Jane Jones, il database che sostiene il processo aziendale che stampa la sua busta paga è meglio per gestire quel tipo di mutazione. Quando spari la mitragliatrice contro l'alieno, la maggior parte delle persone non lo modella mentalmente come la costruzione di un nuovo alieno con meno punti ferita; lo modellano come una mutazione delle proprietà di un alieno esistente.
Quando i concetti del linguaggio di programmazione funzionano fondamentalmente contro il dominio da modellare, è difficile giustificare l'uso di quel linguaggio.
Concorrenza; Gioca estremamente bene con la crescente tecnologia multi-core
Il problema è appena stato risolto. Con strutture di dati immutabili hai una sicurezza dei thread economica al costo di lavorare con dati non aggiornati. Con strutture di dati mutabili hai il vantaggio di lavorare sempre su nuovi dati al costo di dover scrivere logiche complicate per mantenere coerenti i dati. Non è che uno di questi sia ovviamente migliore dell'altro.
I programmi sono generalmente più brevi e in alcuni casi più facili da leggere
Tranne nei casi in cui sono più lunghi e più difficili da leggere. Imparare a leggere i programmi scritti in uno stile funzionale è un'abilità difficile; le persone sembrano essere molto meglio nel concepire i programmi come una serie di passaggi da seguire, come una ricetta, piuttosto che come una serie di calcoli da eseguire.
La produttività aumenta (esempio: Erlang)
La produttività deve aumentare molto per giustificare le ingenti spese di assunzione di programmatori che sanno programmare in uno stile funzionale.
E ricorda, non vuoi buttare via un sistema funzionante; la maggior parte dei programmatori non sta costruendo nuovi sistemi da zero, ma piuttosto mantenendo sistemi esistenti, la maggior parte dei quali costruiti in linguaggi non funzionali. Immagina di provare a giustificarlo agli azionisti. Perché hai eliminato il tuo attuale sistema di gestione stipendi per crearne uno nuovo al costo di milioni di dollari? "Perché la programmazione funzionale è fantastica" è improbabile che piaccia agli azionisti.
La programmazione imperativa è un paradigma molto antico (per quanto ne so) e forse non adatto al 21 ° secolo
Anche la programmazione funzionale è molto antica. Non vedo quanto sia rilevante l'età del concetto.
Non fraintendetemi. Adoro la programmazione funzionale, mi sono unito a questo team perché volevo contribuire a portare i concetti della programmazione funzionale in C # e penso che la programmazione in uno stile immutabile sia la strada per il futuro. Ma ci sono costi enormi per la programmazione in uno stile funzionale che non si può semplicemente desiderare. Il passaggio a uno stile più funzionale avverrà lentamente e gradualmente per un periodo di decenni. Ed è quello che sarà: uno spostamento verso uno stile più funzionale, non un abbraccio globale della purezza e della bellezza di Haskell e l'abbandono del C ++.
Costruisco compilatori per vivere e stiamo sicuramente adottando uno stile funzionale per la prossima generazione di strumenti di compilazione. Questo perché la programmazione funzionale è fondamentalmente una buona corrispondenza per il tipo di problemi che affrontiamo. I nostri problemi riguardano il rilevamento di informazioni non elaborate - stringhe e metadati - e la loro trasformazione in stringhe e metadati diversi. In situazioni in cui si verificano mutazioni, come qualcuno sta digitando nell'IDE, lo spazio problematico si presta intrinsecamente a tecniche funzionali come la ricostruzione incrementale delle sole parti dell'albero che sono cambiate. Molti domini non hanno queste belle proprietà che li rendono ovviamente suscettibili di uno stile funzionale .