Присваивание с помощью «let» не противоречит идее функционального программирования в Clojure

Присваивания следует избегать в функциональном программировании, но в clojure мы часто используем .

Это просто способ быть практичным или назначение не то же самое, что использованиеlet? Не следует ли избегать присваивания в функциональном программировании?

2 ответа

Изменяемое состояние обычно противоречит основным концепциям функционального программирования.

Однако,letпросто связывает имя со значением. Если это значение неизменно, то нет никаких причин, по которым оно несовместимо с идеалами функционального программирования.

Нельзя сказать, что присваивание вообще противоречит идее функционального программирования (ФП).

Аdefвыражение является присваиванием, а также выражением. Давать имена вещам и процедурам/функциям — это средство абстракции, а программирование в значительной степени означает применение абстракции к повторяющимся проблемам.

Императивный стиль неправильно использует назначения для мутации и, таким образом, создает/поддерживает/отображает (глобальные) состояния. Мутация невозможна без присваивания. Таким образом, FP направлен против таких мутаций, а не против назначений как таковых.

На самом деле FP даже не направлен против мутации как таковой. Даже в функциональных языках мутация в некоторых ситуациях требуется по соображениям производительности.

Существует безобидная мутация — мутация переменных, на которые в любом случае никогда больше не ссылаются в остальной части программы — например, потому, что они появляются только в определенной области (например, в области видимостиletвыражение или определение функции). Я склонен называть их «доброкачественными» мутациями. И есть вредная мутация - мутация переменных, о которой будет сказано позже, - мутация переменных, которые продолжают жить вне того объема, в котором они были созданы, - образуя, таким образом, некое неограниченное состояние. Я называю их «злокачественными» мутациями.

На самом деле также неправильно говорить, что FP полностью избегает состояния.

Замыкания на самом деле составляют состояния в FP. Через замыкания функции могут ссылаться на скрытые переменные, которые сохраняют «память»/состояние между различными вызовами функций. Но они применяются очень контролируемым образом.

Вероятно, именно поэтому определение ФП так сложно. Очень быстро кто-то слишком упрощает что-то, тем самым вызывая больше путаницы, чем проясняя вещи.

Другие вопросы по тегам