Функциональное программирование для меня странный зверь. Я изучил F # и Haskell, написал несколько простых программ и люблю их использовать, но у меня никогда не было «вспышки откровения», о которой говорят некоторые люди. Но постепенно я заметил, что все больше и больше я пишу код, который должен был быть неизменным, разбивая задачи на более мелкие функции и пытаясь использовать делегатов намного больше. Это вещь, которая, если вам это нравится, проникает в вашу работу, потому что ценность этих техник очевидна.
Теперь, более практично для обучения: я считаю, что две концепции действительно выбирают функциональное программирование как стиль для меня.
Во-первых, стиль FP основан на структуре данных, а не на композиции, как в ООП. Я смотрел на что-то вроде List в C # как на хитрый трюк для генерации безопасных по типу списков, что-то, что составляло тип (string) в другой тип (list). После изучения FP я теперь смотрю на дженерики больше как на монады. Список - это структурированная форма, которую может принимать код, и он украшает строки.
Во-вторых, и, возможно, более полезной для программистов на C # / ASP, является идея, что FP работает над рекурсией и повторением, в то время как ООП работает с изменчивостью и зацикливанием. Сейчас я склонен думать о жизненном цикле ASP-страницы как о типе FP: каждый запрос обрабатывается с нуля в течение всего жизненного цикла, поэтому вся страница фактически является одной большой медленно повторяющейся программой. Если вы можете сузить это понятие, вы получите лучшее представление о том, как императивная программа может быть структурирована вокруг циклов функций, которые принимают данные, оперируют ими и возвращают новые данные вместо изменения старых.
Самое сложное, по крайней мере для меня, преодоление при таком подходе - это ощущение, что вы теряете кучу ресурсов при использовании изменяемых объектов, что сэкономит тонну памяти. В GC мы верим, и мне просто нужно было научиться избавляться от проблем с производительностью, пока я фактически не увидел, как программа запускалась, и проверял, есть ли они вообще, и если да, то использовать профилировщик, чтобы точно определить, где были проблемы.