Я в основном согласен с ответом FrustratedWithFormsDesign , но вы также спросили, как изучение новой парадигмы помогает развивать свои навыки. Я могу привести пару примеров из собственного опыта.
Начиная с изучения функционального программирования, я намного больше осознаю, какие концепции, с которыми я работаю, более естественно рассматриваются как «объекты» (обычно там, где имеет место мутация), а какие более естественно рассматриваются как неизменные «ценности» (я думаю, что есть важное различие касаясь того, где ОО имеет смысл, по сравнению с тем, когда имеет смысл ФП, но это только мое мнение).
Я замечаю, где мой код включает в себя побочные эффекты, и я более осторожен, чтобы изолировать эти места, делая большинство моих функций «чистыми» функциями. Это значительно улучшает тестируемость моего OO-кода.
Я больше осознаю циклы в моем представлении данных. (Например, я не думаю, что вы можете написать функцию для преобразования связанного списка в двусвязный список в Haskell, поэтому вы замечаете, что циклы на этом языке немного больше.) Избегание циклов уменьшает количество синхронизации вам нужно выполнить, чтобы ваши структуры данных были внутренне согласованными, что облегчает бремя разделения этих структур между потоками.
Я с большей вероятностью полагаюсь на рекурсию (рекурсивные циклические конструкции схемы - это красота). Дейкстра коснулся важности этого в « Заметках по структурированному программированию» - рекурсивные алгоритмы очень точно отображают математическую индукцию, которая, как он полагает, является единственным средством интеллектуального доказательства правильности наших циклов. (Я не предлагаю, чтобы мы доказали, что наш код верен, но чем проще нам сделать это для себя, тем больше вероятность, что наш код верен.)
Я более склонен использовать функции более высокого порядка. Статья Джона Хьюза « Почему функциональное программирование имеет значение» . Это подчеркивает возможность компоновки, которую вы получаете, используя методы функционального программирования, причем функции высшего порядка играют главную роль.
Кроме того, как уже упоминалось в ответе Jetti , вы обнаружите, что многие идеи FP внедряются в новые ОО-языки. Ruby и Python предоставляют много функций более высокого порядка, я слышал, что LINQ описывается как попытка обеспечить поддержку монадического понимания в C #, даже в C ++ теперь есть лямбда-выражения.