Почему хорошо не полагаться на меняющееся состояние?

Этот вопрос возникает из вопроса https://softwareengineering.stackexchange.com/questions/25569 /это-Haskell-стоит обучение

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

Почему?

Я видел, что кто-то сравнивает это с тем, что печатал только левую руку, или, возможно, закрывал глаза на один день и просто полагался на прикосновение. Наверняка, есть нечто большее?

Относится ли это к доступу к аппаратной памяти или к чему-то еще, что является большим выигрышем в производительности?

16 голосов | спросил ocodo 8 Jpm1000000pmSat, 08 Jan 2011 15:31:47 +030011 2011, 15:31:47

4 ответа


17

по крайней мере три больших преимущества от верхней части головы:

  1. он делает программы ближе к математическим выражениям. В математике x не изменяется, вы просто не знаете, что это такое, пока вы не решите уравнение.

  2. В конце концов, изменение состояния is (в конце концов, так работает компьютер на низком уровне); но он ограничен языком в определенных местах. что позволяет компилятору создавать огромные возможности для перемещения кода, чтобы оптимизировать его, поскольку он знает, что он не изменяет ничего, от чего зависит другой код.

  3. Параллельный код не нуждается в синхронизации для доступа к неизменяемым данным, поэтому параллелизм расширяется как в системах с общей памятью SMP (сегодня все многоядерные системы), так и на свободно привязанных кластерах.

ответил Javier 8 Jpm1000000pmSat, 08 Jan 2011 15:53:24 +030011 2011, 15:53:24
4

Вот еще одно преимущество: уменьшение сцепления. Если у вас есть код:

 function doStuff(x) { return x + y;}

и в другом месте:

 function doOtherStuff(x) { y++; return y + x;}

, то две функции зависят неявно . Нет простого способа сказать, что вызов doStuff влияет на вызов doOtherStuff. Без изменяемого состояния вам нужно будет сделать явное соединение.

Конечно, это не проблема с изменчивым состоянием all - проблема с распространенным изменчивым состоянием. Реальное решение заключается в неизменности по умолчанию и некотором способе «маркировки» и ограничения изменяемого состояния на то, где вам это нужно.

ответил Tikhon Jelvis 9 Jam1000000amMon, 09 Jan 2012 01:21:58 +040012 2012, 01:21:58
2

Упрощенный ответ: когда вы видите имя на чисто функциональном языке, вы знаете, что связанное с ним значение является простым поиском его определения. Если у вас есть изменяемые переменные, вы можете только указать, какой из нескольких назначений ему был выполнен последним, поэтому вам также нужно проанализировать поток управления, который, в свою очередь, может быть условным, оставляя вас с несколькими возможностями. Чтобы получить экспоненциальный взрыв, вам нужно только учитывать, что RHS назначений сами зависят от переменных, поэтому вы также должны их рекурсивно анализировать.

Нижняя строка в приведенном выше анализе состоит в том, что она несостоятельна без комментариев, объясняющих намерение, инварианты и семантику: их может быть трудно интерпретировать, и может быть трудно проверить, что семантика соблюдается в фактическом коде.

Этот ответ в основном является расширением точки @ Хавьера 1.

Я думаю, что это также объяснение популярности мошеннического режима OO: с OO инкапсулируется изменчивое состояние, что делает анализ намного легче, локализуя мутации в некоторой степени и позволяя гораздо более надежную экспрессию и проверку семантика.

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

ответил Yttrill 8 Jam1000000amSun, 08 Jan 2012 07:33:05 +040012 2012, 07:33:05
2

Как автор Siege , СУБД, написанная в Haskell, некоторые могут вызывать мой взгляд на изменяемое состояние противоречили. Я надеюсь показать иначе.

Цель изменчивого состояния - описать текущее состояние, в котором находится система. Скажем, у вас есть блог, и он является базой данных в базе данных, база данных описывает записи, которые у вас есть в вашем блоге в момент времени который вы запрашиваете. Сколько сообщений существует прямо сейчас?

Сравните это с неизменяемым состоянием, которое используется для передачи фактов. Сколько сообщений было там 12 августа?

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

ответил dan_waterworth 8 Jam1000000amSun, 08 Jan 2012 08:25:21 +040012 2012, 08:25:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132