Возможно ли для чистых функций в Haskell мутировать локальные копии переменных?
Возможно ли, чтобы чистые функции в Haskell мутировали локальные копии переменных, как это может сделать Clojure, как упоминалось в " Функциональном программировании - это афера"! Дэвид Нолен? Если нет, то каковы причины этого, и если да, то есть ли примеры, на которые кто-нибудь мог бы указать мне?
Аналогичный вопрос был задан в функциях, которые выглядят чисто для вызывающих, но используют внутреннюю мутацию, и общее согласие заключалось в том, что чистые функции могут выполнять мутацию нормально, если мутации выполняются на локальных копиях переменных (т.е. мутации не выходят из функции и имеют нелокальные эффекты).
Возник вопрос, когда я перевел пузырьковую сортировку в Shen ( локальная мутация, глобальная мутация, изменяемые структуры данных, Bubblesort в Qi), которая не изменяет список, в общий lisp и сравнил с пузырьковой сортировкой в Bubblesort в Common Lisp, которая действительно мутирует список. В результате я обнаружил, что (в Common Lisp) версия, которая мутировала список, была значительно быстрее для очень больших списков, чем версия, которая не мутировала список.
1 ответ
ST
Монада именно для безопасного встраивания изменяемых операций в чистый код. Система типов используется для обеспечения того, чтобы ни одна из измененных данных не могла выйти за пределы области действия, таким образом, вы получаете мощь локального изменяемого состояния без опасности сделать всю вашу программу состоящей из состояний (что может разрушить ссылочную прозрачность или ввести условия гонки).
Некоторая документация по монаде ST:
- пикша
- Haskell Wiki
- ST для быстрой сортировки векторов (переполнение стека) - см. Функцию с именем
vsort
, - Оригинальная статья