Наибольшая общность, которую вы найдете в функциональных языках, - это использование функций для хранения данных. Это немного похоже на использование функций доступа к объекту без объекта. Вместо этого функция создается в среде, где она имеет доступ к необходимым данным. Теперь эту функцию можно передавать и использовать где угодно, но при этом сохранится возможность использовать данные.
Вот очень простой пример. Это не чисто функционально, так как изменяет состояние, но достаточно распространено:
(define (make-counter)
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(define x (make-counter))
(x) returns 1
(x) returns 2
...etc...
Итак, у нас есть функция make-counter, которая возвращает другую функцию, которая имеет состояние счетчика внутри. Мы можем вызвать этот вновь созданный счетчик и наблюдать за изменениями внутри.
Так устроены функциональные программы. У вас есть функции, которые принимают функции в качестве аргументов, у вас есть функции, которые возвращают функции со скрытым состоянием и т. Д. Это намного чище, чем управлять памятью самостоятельно.