Как вы можете сделать что-нибудь полезное без изменяемого состояния? - PullRequest
237 голосов
/ 20 июня 2009

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

Практически каждое пользовательское приложение, которое я могу представить, включает в себя состояние как основную концепцию. Если вы пишете документ (или сообщение SO), состояние меняется с каждым новым вводом. Или, если вы играете в видеоигру, существует множество переменных состояния, начиная с позиций всех персонажей, которые имеют тенденцию постоянно перемещаться. Как вы можете сделать что-нибудь полезное, не отслеживая изменения значений?

Каждый раз, когда я нахожу что-то, что обсуждает эту проблему, это написано в действительно техническом функционале, который предполагает тяжелый фон FP, которого у меня нет. Кто-нибудь знает способ объяснить это кому-то с хорошим, глубоким пониманием императивного кодирования, но кто полный n00b с функциональной стороны?

РЕДАКТИРОВАТЬ: куча ответов до сих пор, кажется, пытаются убедить меня в преимуществах неизменных ценностей. Я получил эту часть. Это имеет смысл. Чего я не понимаю, так это как вы можете отслеживать значения, которые должны изменяться, и постоянно изменяться без изменяемых переменных.

Ответы [ 17 ]

3 голосов
/ 29 августа 2011

Для интерактивных приложений, таких как игры, Функциональное реактивное программирование - ваш друг: если вы можете сформулировать свойства игрового мира как изменяющиеся во времени значения (и / или событие потоки), вы готовы! Эти формулы иногда будут даже более естественными и более интересными, чем изменение состояния, например для движущегося шара вы можете напрямую использовать известный закон x = v * t . И что еще лучше, правила игры, написанные таким образом , составляют лучше, чем объектно-ориентированные абстракции. Например, в этом случае скорость мяча может быть также изменяющейся во времени величиной, которая зависит от потока событий, состоящего из столкновений мяча. Подробнее о конструктивном подходе см. Создание игр в Вязах .

2 голосов
/ 20 июня 2009

Именно так FORTRAN будет работать без ОБЩИХ блоков: вы будете писать методы, в которых будут передаваться значения и локальные переменные. Вот и все.

Объектно-ориентированное программирование объединило нас в состояние и поведение, но это была новая идея, когда я впервые столкнулся с ней из C ++ в 1994 году.

Боже, я был функциональным программистом, когда был инженером-механиком, и я этого не знал!

1 голос
/ 20 июня 2009

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

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

1 голос
/ 20 июня 2009

Имейте в виду: функциональные языки Тьюринга завершены. Поэтому любое полезное задание, которое вы выполняете на непостоянном языке, может быть выполнено на функциональном языке. В конце концов, я думаю, что можно сказать о гибридном подходе. Такие языки, как F # и Clojure (и я уверен, что другие) поощряют дизайн без сохранения состояния, но допускают изменчивость при необходимости.

0 голосов
/ 30 октября 2015

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

Вот пример:

function ReadDataFromKeyboard() {
    $input_values = $_POST[];
    return $input_values;
}
function ProcessInformation($input_values) {
    if ($input_values['a'] > 10)
        return ($input_values['a'] + $input_values['b'] + 3);
    else if ($input_values['a'] > 5)
        return ($input_values['b'] * 3);
    else
        return ($input_values['b'] - $input_values['a'] - 7);
}
function DisplayToPage($data) {
    print "Based your input, the answer is: ";
    print $data;
    print "\n";
}

/* begin: */
DisplayToPage (
    ProcessInformation (
        GetDataFromKeyboard()
    )
);
0 голосов
/ 20 июня 2009
...