Je suis fondamentalement d'accord avec la réponse de FrustratedWithFormsDesign , mais vous avez également demandé comment l'apprentissage du nouveau paradigme aide à développer ses compétences. Je peux donner quelques exemples tirés de ma propre expérience.
Depuis l'apprentissage de la programmation fonctionnelle, je suis beaucoup plus conscient des concepts avec lesquels je travaille sont plus naturellement considérés comme des "objets" (généralement où la mutation a du sens) et qui sont plus naturellement considérés comme des "valeurs" immuables (je pense qu'il y a une distinction importante , en abordant où OO a du sens par rapport à quand FP a du sens, mais c'est juste mon opinion).
Je remarque où mon code inclut des effets secondaires, et je fais plus attention à isoler ces endroits, rendant plus de mes fonctions "pures". Cela améliore considérablement la testabilité de mon code OO.
Je suis plus conscient des cycles dans ma représentation des données. (Par exemple, je ne pense pas que vous puissiez écrire une fonction pour convertir une liste chaînée en une liste doublement liée dans Haskell, donc vous remarquez beaucoup plus de cycles dans ce langage.) Éviter les cycles réduit la quantité de synchronisation vous devez effectuer pour que vos structures de données soient cohérentes en interne, ce qui simplifie le partage de ces structures entre les threads.
Je suis plus susceptible de compter sur la récursivité (les constructions en boucle récursive du schéma sont des choses de beauté). Dijkstra a souligné l'importance de cela dans les Notes sur la programmation structurée - les algorithmes récursifs sont très directement liés à l'induction mathématique, ce qui, selon lui, est le seul moyen de prouver intellectuellement que nos boucles sont correctes. (Je ne suggère pas que nous devons prouver que notre code est correct, mais que plus nous le faisons facilement pour nous-mêmes, plus il est probable que notre code est correct.)
Je suis plus susceptible d'utiliser des fonctions d'ordre supérieur. L'article de John Hughes, Why Functional Programming Matters . Il met l'accent sur la composabilité que vous obtenez en utilisant des techniques de programmation fonctionnelles, des fonctions d'ordre supérieur jouant un rôle majeur.
En outre, comme évoqué dans la réponse de Jetti , vous constaterez que de nombreuses idées de PF sont intégrées dans les nouveaux langages OO. Ruby et Python fournissent tous les deux de nombreuses fonctions d'ordre supérieur, j'ai entendu LINQ décrit comme une tentative d'apporter le support des compréhensions monadiques en C #, même C ++ a maintenant des expressions lambda.