Предотвращает ли функциональное программирование состояние?
Согласно wikipedia: функциональное программирование - это парадигма программирования, которая рассматривает вычисления как оценку математических функций и позволяет избежать состояния и изменяемые данные. (акцент мой).
Это правда? Мое личное понимание заключается в том, что он делает состояние более явным, в том смысле, что программирование в основном применяет функции (преобразования) к заданному состоянию для получения преобразованного состояния. В частности, конструкции, такие как монады, позволяют вам явно переносить состояние через функции. Я также не думаю, что любая парадигма программирования может вообще избежать состояния.
Итак, правильное или неправильное определение википедии? И если это неправильно, то что лучше определить функциональное программирование?
Изменить. Я полагаю, что центральным моментом в этом вопросе является состояние? Вы понимаете, что состояние - это переменные или атрибуты объекта (изменяемые данные) или неизменяемые данные? Чтобы взять пример (в F #):
let x = 3
let double n = 2 * n
let y = double x
printfn "%A" y
Вы бы сказали, что этот фрагмент содержит состояние или нет?
Изменить 2: Спасибо всем за участие. Теперь я понимаю, что проблема скорее связана с лингвистическим расхождением с использованием слова state
, отличающегося от одного сообщества к другому, как упоминает Брайан в своем комментарии. В частности, многие в сообществе функционального программирования (в основном Haskellers) интерпретируют state
, чтобы нести какое-то состояние динамизма, как сигнал, изменяющийся со временем. Другие виды использования state
в таких вещах, как конечный автомат, репрезентативный перенос состояний и безстоящие сетевые протоколы могут означать разные вещи.
Ответы
Ответ 1
Я думаю, что вы просто используете термин "состояние" необычным образом. Если вы считаете, что добавить 1 и 1, чтобы получить 2 как состояние, то вы можете сказать, что функциональное программирование охватывает состояние. Но когда большинство людей говорят "состояние", они означают сохранение и изменение значений, так что вызов функции может оставить вещи разными, чем до того, как была вызвана функция, а вызов функции второй раз с одним и тем же входом может не иметь того же результата.
По сути, вычисления без учета состояния таковы:
- Результат 1 + 1
- Строка, состоящая из 's', добавленная к "pool"
- Область данного прямоугольника
Учеты с учётом состояния такие вещи:
- Увеличение счетчика
- Удалить элемент из массива
- Установите ширину прямоугольника в два раза больше, чем сейчас.
Ответ 2
Вместо того, чтобы избегать состояния, подумайте об этом так:
Это позволяет избежать изменения состояния. Это слово "изменчивое".
Подумайте в терминах объекта С# или Java. Обычно вы вызываете метод объекта, и вы можете ожидать, что он изменит его внутреннее состояние в результате этого вызова метода.
С функциональным программированием у вас все еще есть данные, но он просто проходит через каждую функцию, создавая вывод, соответствующий вводу и операции.
По крайней мере, в теории. В действительности, не все, что вы делаете, фактически работает функционально, поэтому вы часто оказываетесь в скрытом состоянии, чтобы заставить все работать.
Edit:
Конечно, скрытое состояние также часто приводит к некоторым впечатляющим ошибкам, поэтому вы должны использовать только языки функционального программирования для чисто функциональных ситуаций. Я обнаружил, что лучшие языки являются объектно-ориентированными и функциональными, такими как Python или С#, предоставляя вам лучшее из обоих миров и свободу передвижения между ними по мере необходимости.
Ответ 3
Определение Википедии верное. Сначала это может показаться озадачивающим, но если вы начнете работать с Haskell, вы заметите, что у вас нет переменных, содержащих значения, содержащие значения.
Состояние все еще может быть представлено в виде state monads.
Ответ 4
Правило Википедии правильное. Функциональное программирование позволяет избежать состояния. Функциональное программирование означает, что вы применяете функцию к данному входу и получаете результат. Тем не менее, гарантируется, что ваш вход никоим образом не будет изменен. Это не означает, что вы не можете иметь состояние вообще. Монады - прекрасный пример этого.