Подтвердить что ты не робот

Предотвращает ли функциональное программирование состояние?

Согласно wikipedia: функциональное программирование - это парадигма программирования, которая рассматривает вычисления как оценку математических функций и позволяет избежать состояния и изменяемые данные. (акцент мой).

Это правда? Мое личное понимание заключается в том, что он делает состояние более явным, в том смысле, что программирование в основном применяет функции (преобразования) к заданному состоянию для получения преобразованного состояния. В частности, конструкции, такие как монады, позволяют вам явно переносить состояние через функции. Я также не думаю, что любая парадигма программирования может вообще избежать состояния.

Итак, правильное или неправильное определение википедии? И если это неправильно, то что лучше определить функциональное программирование?

Изменить. Я полагаю, что центральным моментом в этом вопросе является состояние? Вы понимаете, что состояние - это переменные или атрибуты объекта (изменяемые данные) или неизменяемые данные? Чтобы взять пример (в F #):

let x = 3
let double n = 2 * n
let y = double x
printfn "%A" y

Вы бы сказали, что этот фрагмент содержит состояние или нет?

Изменить 2: Спасибо всем за участие. Теперь я понимаю, что проблема скорее связана с лингвистическим расхождением с использованием слова state, отличающегося от одного сообщества к другому, как упоминает Брайан в своем комментарии. В частности, многие в сообществе функционального программирования (в основном Haskellers) интерпретируют state, чтобы нести какое-то состояние динамизма, как сигнал, изменяющийся со временем. Другие виды использования state в таких вещах, как конечный автомат, репрезентативный перенос состояний и безстоящие сетевые протоколы могут означать разные вещи.

4b9b3361

Ответ 1

Я думаю, что вы просто используете термин "состояние" необычным образом. Если вы считаете, что добавить 1 и 1, чтобы получить 2 как состояние, то вы можете сказать, что функциональное программирование охватывает состояние. Но когда большинство людей говорят "состояние", они означают сохранение и изменение значений, так что вызов функции может оставить вещи разными, чем до того, как была вызвана функция, а вызов функции второй раз с одним и тем же входом может не иметь того же результата.

По сути, вычисления без учета состояния таковы:

  • Результат 1 + 1
  • Строка, состоящая из 's', добавленная к "pool"
  • Область данного прямоугольника

Учеты с учётом состояния такие вещи:

  • Увеличение счетчика
  • Удалить элемент из массива
  • Установите ширину прямоугольника в два раза больше, чем сейчас.

Ответ 2

Вместо того, чтобы избегать состояния, подумайте об этом так:

Это позволяет избежать изменения состояния. Это слово "изменчивое".

Подумайте в терминах объекта С# или Java. Обычно вы вызываете метод объекта, и вы можете ожидать, что он изменит его внутреннее состояние в результате этого вызова метода.

С функциональным программированием у вас все еще есть данные, но он просто проходит через каждую функцию, создавая вывод, соответствующий вводу и операции.

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

Edit:
Конечно, скрытое состояние также часто приводит к некоторым впечатляющим ошибкам, поэтому вы должны использовать только языки функционального программирования для чисто функциональных ситуаций. Я обнаружил, что лучшие языки являются объектно-ориентированными и функциональными, такими как Python или С#, предоставляя вам лучшее из обоих миров и свободу передвижения между ними по мере необходимости.

Ответ 3

Определение Википедии верное. Сначала это может показаться озадачивающим, но если вы начнете работать с Haskell, вы заметите, что у вас нет переменных, содержащих значения, содержащие значения.

Состояние все еще может быть представлено в виде state monads.

Ответ 4

Правило Википедии правильное. Функциональное программирование позволяет избежать состояния. Функциональное программирование означает, что вы применяете функцию к данному входу и получаете результат. Тем не менее, гарантируется, что ваш вход никоим образом не будет изменен. Это не означает, что вы не можете иметь состояние вообще. Монады - прекрасный пример этого.