Багато сучасних мов програмування підтримують деяку концепцію закриття , тобто фрагмент коду (блок або функцію), який
- Може трактуватися як значення, і тому зберігається у змінній, передається навколо різних частин коду, визначається в одній частині програми та викликається у зовсім іншій частині тієї ж програми.
- Може захоплювати змінні з контексту, в якому він визначений, і отримувати доступ до них, коли пізніше викликається (можливо, в абсолютно іншому контексті).
Ось приклад закриття, написаного в Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Літерал функції x => x >= lowerBound
містить вільну змінну lowerBound
, яка закрита (пов'язана) аргументом функції, filterList
що має те саме ім'я. Закриття передається методу бібліотеки filter
, який може повторно викликати його як звичайну функцію.
Я читав багато питань і відповідей на цьому веб-сайті, і, наскільки я розумію, термін закриття часто автоматично асоціюється з функціональним програмуванням та стилем функціонального програмування.
Визначення функціонального програмування у вікіпедії звучить:
В інформатиці функціональне програмування - це парадигма програмування, яка розглядає обчислення як оцінку математичних функцій та уникає даних про стан та змінні. Він підкреслює застосування функцій на відміну від імперативного стилю програмування, який підкреслює зміни у стані.
і далі
[...] у функціональному коді вихідне значення функції залежить лише від аргументів, які вводяться у функцію [...]. Усунення побічних ефектів може значно полегшити розуміння та прогнозування поведінки програми, що є однією з ключових мотивацій розвитку функціонального програмування.
З іншого боку, багато конструкцій закриття, що надаються мовами програмування, дозволяють закриттю захоплювати не локальні змінні та змінювати їх, коли викликається закриття, тим самим створюючи побічний ефект на середовище, в якому вони були визначені.
У цьому випадку закриття реалізують першу ідею функціонального програмування (функції - це першокласні об'єкти, які можна переміщувати, як і інші значення), але нехтують другою ідеєю (уникаючи побічних ефектів).
Чи вважається це використання закриттів із побічними ефектами функціональним стилем або це закриття вважається більш загальною конструкцією, яка може бути використана як для функціонального, так і нефункціонального стилю програмування? Чи є література на цю тему?
ВАЖЛИВА ПРИМІТКА
Я не сумніваюся у корисності побічних ефектів або у закритті побічних ефектів. Також мене не цікавить дискусія про переваги / недоліки закриттів із побічними ефектами чи без них.
Мені цікаво лише знати, чи використання таких закривань прихильником функціонального програмування все ще вважається функціональним стилем, або, навпаки, їх використання не рекомендується використовувати при використанні функціонального стилю.