Многие современные языки программирования поддерживают некоторую концепцию замыкания , то есть кусок кода (блок или функцию), который
- Может рассматриваться как значение и, следовательно, храниться в переменной, передаваться различным частям кода, определяться в одной части программы и вызываться в совершенно другой части той же программы.
- Может захватывать переменные из контекста, в котором они определены, и получать к ним доступ при последующем вызове (возможно, в совершенно ином контексте).
Вот пример замыкания, написанного на Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Литерал функции x => x >= lowerBound
содержит свободную переменную lowerBound
, которая закрыта (связана) аргументом функции filterList
с тем же именем. Закрытие передается методу библиотеки filter
, который может вызывать его повторно как обычную функцию.
Я читал много вопросов и ответов на этом сайте, и, насколько я понимаю, термин « закрытие» часто автоматически ассоциируется с функциональным программированием и функциональным стилем программирования.
Определение функции программирования в Википедии гласит:
В информатике функциональное программирование - это парадигма программирования, которая рассматривает вычисления как оценку математических функций и избегает состояния и изменчивых данных. Он подчеркивает применение функций, в отличие от императивного стиля программирования, который подчеркивает изменения в состоянии.
и далее
[...] в функциональном коде выходное значение функции зависит только от аргументов, которые вводятся в функцию [...]. Устранение побочных эффектов может значительно облегчить понимание и прогнозирование поведения программы, что является одним из ключевых факторов развития функционального программирования.
С другой стороны, многие конструкции замыкания, предоставляемые языками программирования, позволяют замыканию захватывать нелокальные переменные и изменять их при вызове замыкания, создавая тем самым побочный эффект для среды, в которой они были определены.
В этом случае замыкания реализуют первую идею функционального программирования (функции - это объекты первого класса, которые можно перемещать, как и другие значения), но игнорируют вторую идею (избегая побочных эффектов).
Это использование замыканий с побочными эффектами считается функциональным стилем или замыкания считаются более общей конструкцией, которая может использоваться как для функционального, так и для нефункционального стиля программирования? Есть ли литература на эту тему?
ВАЖНАЯ ЗАМЕТКА
Я не подвергаю сомнению полезность побочных эффектов или наличия закрытий с побочными эффектами. Кроме того, меня не интересует обсуждение преимуществ / недостатков укупорочных средств с побочными эффектами или без них.
Мне только интересно узнать, считается ли использование таких замыканий функциональным стилем сторонником функционального программирования или, наоборот, их использование не рекомендуется при использовании функционального стиля.