Этот вопрос возникает из вопроса /software/25569/is-haskell-worth-learning
Обычно делается несколько часто повторяемых заявлений о том, как Haskell улучшает ваши навыки кодирования на других языках, и, кроме того, это потому, что Haskell не имеет состояния, и это хорошо.
Почему?
Я видел, как кто-то сравнивал это с тем, чтобы печатать только левой рукой, или, возможно, закрыть глаза на день и просто положиться на прикосновение. Конечно, это еще не все?
Это относится к аппаратному доступу к памяти или к чему-то еще, что приводит к значительному увеличению производительности?
Ответы:
у меня по крайней мере три больших преимущества:
это делает программы более близкими к математическим выражениям. В математике
x
не меняется, вы просто не знаете, что это такое, пока не решите уравнение.В конце концов, это изменение состояния ( в конце концов, это как компьютер работает на низком уровне); но это ограничено языком в определенных местах. это дает компилятору огромные возможности для перемещения кода для его оптимизации, поскольку он знает, что он ничего не меняет, от чего зависит другой код.
Параллельный код не должен синхронизироваться для доступа к неизменяемым данным, поэтому параллелизм повышается как в системах с общей памятью SMP (все современные многоядерные системы), так и в слабо связанных кластерах.
источник
Вот еще одно преимущество: уменьшенное сцепление. Если у вас есть такой код:
а в других местах у вас есть:
тогда две функции зависят неявно . Нет простого способа сказать, что на вызов
doStuff
влияет вызовdoOtherStuff
. Без изменяемого состояния вы должны сделать соединение явным.Конечно, это проблема не всех изменяемых состояний, а проблема распространяющегося изменяемого состояния. Реальное решение состоит в том, чтобы иметь неизменяемость по умолчанию и какой-то способ «пометить» и ограничить изменяемое состояние именно там, где оно вам нужно.
источник
Упрощенный ответ таков: когда вы видите имя на чисто функциональном языке, вы узнаете, что такое ассоциированное значение, путем простого поиска его определения. Если у вас есть изменяемые переменные, вы можете только определить, по какому из нескольких назначений он был выполнен последним, поэтому вам также нужно проанализировать поток управления, который, в свою очередь, может быть условным, предоставляя вам множество возможностей. Чтобы получить экспоненциальный взрыв, вам нужно только учитывать, что RHS заданий сами по себе зависят от переменных, поэтому вам придется рекурсивно их анализировать.
Суть в приведенном выше анализе заключается в том, что он бесполезен без комментариев, объясняющих намерение, инварианты и семантику: это может быть трудно интерпретировать, и может быть трудно проверить, соблюдается ли семантика в реальном коде.
Этот ответ в основном является расширением точки 1 Хавьера.
Я думаю, что это также объясняет популярность мошеннического режима OO: в OO изменяемое состояние инкапсулируется, что значительно облегчает анализ за счет локализации мутаций в некоторой степени и позволяет гораздо более надежное выражение и проверку семантики.
Отметив это, функциональное программирование не является ответом. Правильный ответ - это система, которая поддерживает как индуктивное (функциональное), так и коиндуктивное (процедурное) программирование, поэтому правильные инструменты могут обрабатывать как программирование без сохранения состояния, так и программирование с сохранением состояния. Просто конструктивная (функциональная) теория хорошо известна, тогда как теория государственного управления все еще находится в зачаточном состоянии.
источник
Как пишет автор Siege , СУБД, написанной на Haskell, некоторые могут назвать мой взгляд на изменчивое состояние противоречивым. Я надеюсь показать иначе.
Цель изменяемого состояния - описать текущее состояние, в котором находится система. Допустим, у вас есть блог, и он поддерживается базой данных, база данных описывает сообщения, которые есть в вашем блоге в тот момент, когда вы запрашиваете Это. Сколько сообщений существует прямо сейчас?
Сравните это с неизменным состоянием, которое используется для передачи фактов. Сколько постов было 12 августа?
Факты легко рассуждать, изменчивое состояние - нет. Однако изменчивое состояние - это не какой-то нечистый нечистый эффект, который следует изгнать из наших умов; нам часто нужно, чтобы он сосуществовал в изменчивом мире, в котором мы живем, нам просто нужно использовать его более экономно.
источник