Что есть в C# от функционального программирования?

Давайте «плясать» от определений.

Парадигма — набор принципов и подходов при написании программы.

Программа, написанная в парадигме императивного программирования представляет собой по сути набор приказов компьютеру: создай и инициализируй переменную, сложи/умножь(и т.д.) ее значение с результатом вызова функции и т.д. Сюда же можно добавить циклы, ветвления и другие конструкции.

Объектно-ориентированное программирование (ООП) относится к множеству императивных парадигм.

Функциональное программирование зиждется не на приказах, а на декларациях, т.е. в парадигме функционального программирования описывается (декларируется) проблема и ожидаемое решение проблемы, результат.

Примеры деклараций и приказов можно найти и в обычной жизни. Когда вы просите сына сходить в магазин за хлебом – это императивный подход, а когда теща говорит зятю: «Как хочешь, крутись, но хочу быть похоронена в кремлевской стене», - это декларативное пожелание. Граница между декларацией и приказом нечеткая. Например, что это, декларация или приказ? - из фильма Snatch:

  • Customs officer: Anything to declare?
  • Avi: Yeah. Don’t go to England.

Но есть некоторые признаки функционального программирования:

  1. Отсутствие промежуточного состояния.
  2. Функции передаются как аргументы.
  3. Рекурсии (функция вызывает саму себя).
  4. Использование анонимных функций (с помощью лямбда выражений).

Получается, что для того, чтобы на C# программировать не императивно, а функционально, достаточно просто перестать использовать переменные, т.е. добровольно отказаться от промежуточного состояния. Зачем и когда это надо? – вопрос, конечно интересный. Решение некоторых задач с помощью функционального программирования выглядит действительно красиво. Например, так выглядит решение задачи расчета факториала на чисто функциональном языке Haskell:

Реализация функции факторила на Haskell

На C# это будет выглядеть, наверное, так:

программирование в функциональном стиле на C#

Но, для хоть сколь-нибудь крупных проектов отказ от промежуточных состояний – это добровольный отказ от комфортного поиска ошибок, что, на мой взгляд –непрактично. Думаю, именно с точки зрения практичности c# занимает 5 строчку в рейтинге популярности языков, а Haskell – 45 строчку.

Резюме:

В c# есть много чего интересного от функционального программирования: делегаты, рекурсии, лямбда-выражения,- но есть и много других полезных конструкций, от которых не стоит отказываться.

Оцените эту статью