Будучи относительно новым для функционального программирования, я трачу много энергии на размышления: «Это функциональный способ делать что-то?» Очевидно, что рекурсия и итерация довольно просты, и очевидно, что рекурсия - это функциональный способ выполнения задач. Но возьмем замыкания, например.
Я узнал о замыканиях с помощью Lisp и понимаю, что замыкания представляют собой сочетание функции и среды (очень похоже на состояние и поведение). Например:
(let ((x 1))
(defun doubleX()
(setf x (* x 2))))
Здесь у нас есть функция doubleX, которая была определена в среде переменной x. Мы могли бы передать эту функцию другим функциям, а затем вызвать ее, и она все равно сможет ссылаться на переменную x. Функция может продолжать ссылаться на эту переменную, даже если она вызывается вне среды, в которой переменная была определена. Многие из примеров закрытия, которые я видел, выглядят так. Где setf используется для изменения значения лексической переменной. Это смущает меня, потому что:
1.) Я думал, что Сетф был злом. Главным образом потому, что это вызывает побочные эффекты и, по-видимому, они также являются злом.
2.) Это действительно «функционально»? Похоже, это просто способ сохранить глобальное состояние, и я думал, что функциональные языки не имеют состояния.
Может быть, я просто не понимаю замыкания. Кто-нибудь может мне помочь?