Присваивание с помощью «let» не противоречит идее функционального программирования в Clojure
Присваивания следует избегать в функциональном программировании, но в clojure мы часто используем .
Это просто способ быть практичным или назначение не то же самое, что использованиеlet
? Не следует ли избегать присваивания в функциональном программировании?
2 ответа
Изменяемое состояние обычно противоречит основным концепциям функционального программирования.
Однако,let
просто связывает имя со значением. Если это значение неизменно, то нет никаких причин, по которым оно несовместимо с идеалами функционального программирования.
Нельзя сказать, что присваивание вообще противоречит идее функционального программирования (ФП).
Аdef
выражение является присваиванием, а также выражением. Давать имена вещам и процедурам/функциям — это средство абстракции, а программирование в значительной степени означает применение абстракции к повторяющимся проблемам.
Императивный стиль неправильно использует назначения для мутации и, таким образом, создает/поддерживает/отображает (глобальные) состояния. Мутация невозможна без присваивания. Таким образом, FP направлен против таких мутаций, а не против назначений как таковых.
На самом деле FP даже не направлен против мутации как таковой. Даже в функциональных языках мутация в некоторых ситуациях требуется по соображениям производительности.
Существует безобидная мутация — мутация переменных, на которые в любом случае никогда больше не ссылаются в остальной части программы — например, потому, что они появляются только в определенной области (например, в области видимостиlet
выражение или определение функции). Я склонен называть их «доброкачественными» мутациями. И есть вредная мутация - мутация переменных, о которой будет сказано позже, - мутация переменных, которые продолжают жить вне того объема, в котором они были созданы, - образуя, таким образом, некое неограниченное состояние. Я называю их «злокачественными» мутациями.
На самом деле также неправильно говорить, что FP полностью избегает состояния.
Замыкания на самом деле составляют состояния в FP. Через замыкания функции могут ссылаться на скрытые переменные, которые сохраняют «память»/состояние между различными вызовами функций. Но они применяются очень контролируемым образом.
Вероятно, именно поэтому определение ФП так сложно. Очень быстро кто-то слишком упрощает что-то, тем самым вызывая больше путаницы, чем проясняя вещи.