Parce que tous ces avantages sont aussi des inconvénients.
Programmes apatrides; Pas d'effets secondaires
Les programmes du monde réel concernent tous les effets secondaires et les mutations. Lorsque l'utilisateur appuie sur un bouton, c'est parce qu'il veut que quelque chose se passe. Quand ils tapent quelque chose, ils veulent que cet état remplace tout état qui existait auparavant. Lorsque Jane Smith en comptabilité se marie et change son nom pour Jane Jones, la base de données soutenant le processus commercial qui imprime son chèque de paie a tout intérêt à gérer ce type de mutation. Lorsque vous tirez la mitrailleuse sur l'étranger, la plupart des gens ne modélisent pas mentalement cela comme la construction d'un nouvel étranger avec moins de points de vie; ils modélisent cela comme une mutation des propriétés d'un étranger existant.
Lorsque les concepts du langage de programmation fonctionnent fondamentalement contre le domaine en cours de modélisation, il est difficile de justifier l'utilisation de ce langage.
Concurrence; Joue extrêmement bien avec la technologie multicœur montante
Le problème est simplement repoussé. Avec des structures de données immuables, vous avez une sécurité de threads bon marché au prix de travailler éventuellement avec des données périmées. Avec les structures de données mutables, vous avez l'avantage de toujours travailler sur de nouvelles données au prix d'avoir à écrire une logique compliquée pour maintenir la cohérence des données. Ce n'est pas comme si l'un d'eux était évidemment meilleur que l'autre.
Les programmes sont généralement plus courts et dans certains cas plus faciles à lire
Sauf dans les cas où ils sont plus longs et plus difficiles à lire. Apprendre à lire des programmes écrits dans un style fonctionnel est une compétence difficile; les gens semblent bien mieux concevoir les programmes comme une série d'étapes à suivre, comme une recette, plutôt que comme une série de calculs à effectuer.
La productivité augmente (exemple: Erlang)
La productivité doit beaucoup augmenter pour justifier les dépenses massives d'embauche de programmeurs qui savent programmer dans un style fonctionnel.
Et rappelez-vous, vous ne voulez pas jeter un système qui fonctionne; la plupart des programmeurs ne construisent pas de nouveaux systèmes à partir de zéro, mais maintiennent plutôt des systèmes existants, dont la plupart ont été construits dans des langages non fonctionnels. Imaginez essayer de justifier cela aux actionnaires. Pourquoi avez-vous abandonné votre système de paie actuel pour en construire un nouveau au prix de millions de dollars? "Parce que la programmation fonctionnelle est géniale" ne plaira probablement pas aux actionnaires.
La programmation impérative est un très vieux paradigme (pour autant que je sache) et peut-être pas adapté au 21e siècle
La programmation fonctionnelle est également très ancienne. Je ne vois pas en quoi l'âge du concept est pertinent.
Ne vous méprenez pas. J'adore la programmation fonctionnelle, j'ai rejoint cette équipe parce que je voulais aider à introduire des concepts de la programmation fonctionnelle en C #, et je pense que la programmation dans un style immuable est la voie de l'avenir. Mais il y a des coûts énormes à programmer dans un style fonctionnel qui ne peut pas être simplement ignoré. Le passage à un style plus fonctionnel va se produire lentement et progressivement sur une période de plusieurs décennies. Et c'est ce que ce sera: un virage vers un style plus fonctionnel, pas un embrassement en gros de la pureté et de la beauté de Haskell et l'abandon du C ++.
Je construis des compilateurs pour gagner ma vie et nous adoptons définitivement un style fonctionnel pour la prochaine génération d'outils de compilation. En effet, la programmation fonctionnelle est fondamentalement une bonne adéquation avec le type de problèmes auxquels nous sommes confrontés. Nos problèmes concernent la prise en compte d'informations brutes - chaînes et métadonnées - et leur transformation en différentes chaînes et métadonnées. Dans les situations où des mutations se produisent, comme si quelqu'un tape dans l'EDI, l'espace du problème se prête intrinsèquement à des techniques fonctionnelles telles que la reconstruction incrémentielle uniquement des parties de l'arborescence qui ont changé. De nombreux domaines n'ont pas ces belles propriétés qui les rendent évidemment adaptés à un style fonctionnel .