Практика Функционального Програмирования. Выпуск 1. Июль 2009
Языки программирования, используемые в разработке промышленных систем, не стоят на месте. Вводятся в оборот новые идиомы, да и сами языки расширяются с целью добавления возможности оперировать абстракциями более высокого порядка. Языки C# и Visual Basic обзавелись абстракцией LINQ, позволяющей декларативно производить запросы к структурированной информации, базам данных. В язык Java добавили обобщённые типы данных («generics»); велись жаркие дебаты по добавлению замыканий в стандарт Java 7. В новом стандарте языка C++ появилось ключевое слово lambda с соответствующей семантикой. Да и предлагавшаяся² абстракция «концептов» в C++, структурирующая описание полиморфных интерфейсов, возникла из необходимости бороться с нарастающей сложностью создаваемых человеком информационных систем. Есть ли что-то общее между этими нововведениями, или разные языки развиваются независимо и разнонаправленно? Как оказывается, общий вектор развития языков прослеживается без особого труда. С целью повышения уровня абстракции от аппаратуры и приближения к проблемным областям всё большее количество концепций, созданных в рамках парадигмы функционального программирования, находят своё место в императивных языках. Функциональная парадигма программирования и функциональные языки уже долгое время являются источником «новых» идей в массовых языках программирования. Отказ от ручного управления памятью и использование сборщика мусора (Smalltalk, Java, C#) пришли из функциональных языков типа LISP, где сборка мусора появилась ещё в 1959 году. Генераторы списков³ в языке Python и новом стандарте JavaScript пришли из функциональных языков Haskell и Miranda, впервые появившись в функциональном языке NPL. Некоторые абстракции в императивных языках разработаны почти независимо от соответствующих абстракций в функциональных языках, но развиваются десятилетиями позже. Так, например, проект «концептов» в новом стандарте C++ соответствовал «классам типов» в языке Haskell, появившимся в нём в 1989 году. Технология LINQ в .Net тоже является прямым результатом мышления в функциональном стиле. Не случайно, что автор LINQ, Эрик Мейджер, является одним из дизайнеров функционального языка Haskell. Вот что говорит ведущий архитектор языка C#, а также создатель Turbo Pascal и Delphi, Андерс Хейлсберг [5]: Функциональное программирование, по-моему, — чрезвычайно интересная парадигма. Если взглянуть на C# 3.0, то станет видно, что именно идеи из мира функционального программирования послужили источником вдохновения для LINQ и составляющих его элементов языка. Мне кажется, сейчас, наконец, наступил момент, когда функциональному программированию пора выйти в массы. Как мы видим, элементы функционального программирования проникают в массы путём постепенного внедрения в обычные, императивные языки. Что необходимо программисту для эффективного использования этих элементов? Мы убеждены, что для наиболее эффективного усвоения того или иного метода или парадигмы программирования, их нужно изучать в максимально чистом виде, удалённом от «мусора» альтернативных подходов. Владение функциональной парадигмой в её «чистом» виде позволяет эффективно применять новые функциональные элементы современных языков для управления сложностью разрабатываемых систем, а также существенно обогащает набор инструментов, доступных для решения той или иной задачи.