Сначала я новичок Haskell. Я читал: Immutable functional objects in highly mutable domain И мой вопрос почти такой же - как эффективно писать алгоритмы, в которых должно измениться состояние. Возьмем, к примеру, алгоритм Дейкстры. Будут обнаружены новые пути, и расстояния должны быть обновлены. И в традиционных языках это просто, в то время как в Haskell, например, я могу думать только о создании совершенно новых расстояний, которые будут слишком медленными и потребляющими память. Есть ли что-то вроде шаблонов проектирования для таких случаев, когда нужно реализовать алгоритм с изменяемой структурой данных, а скорость и использование памяти - основные проблемы?Mutability в функциональном программировании
ответ
Существует, конечно, много способов, чтобы функциональные языки рассматривали эту проблему.
Различные структуры данных - структуры многих данных могут быть реализованы в чисто функциональной образом, с той же алгоритмической сложностью как императивная версия. Вероятно, самой известной работой в этой области является Purely Functional Data Structures Криса Окасаки, но есть много других ресурсов. Для алгоритма Дейкстры целесообразно работать Martin Erwig по адресу functional graphs. См. Также this question.
Различные алгоритмы - некоторые алгоритмы имеют предположения о встроенной модификации, Quicksort - пример этого. В этом случае можно использовать альтернативный алгоритм, который более поддается неизменности.
Mutable state - каждый функциональный язык может моделировать функциональное состояние с государственной монадой. Большинство из них также обеспечивают другие формы изменчивости, такие как монашеская монашка Haskell и IORef.
ST Monad позволяет использовать изменяемое состояние внутри, но представляет собой чистый внешний интерфейс.
Создание новых неизменяемых объектов не так дорого, как вы могли бы подумать, поскольку может произойти большое количество структурного обмена, поскольку компилятор ЗНАЕТ, что они не могут измениться и, следовательно, могут быть безопасно распределены. Тем не менее, использование крайне императивных алгоритмов с большим количеством изменчивого состояния в Haskell - это немного запаха кода.
В производных ML (таких как OCaml, SML, F #) есть «ссылки», которые могут использоваться как изменяемые переменные.
В Haskell это не чисто обрабатывается. Государство просто не покрывается обычным «чисто функциональным» стилем. Чистые языки FP связаны с «вечными истинами» и поэтому не очень подходят для работы с «эфемерными истинами» (хотя это можно сделать, определенно).
Однако да, иногда мы необходимо изменчивое состояние. Язык, такой как ATS, включает линейные типы для обработки разрушительных обновлений и безопасного управления ресурсами.
- 1. Интерфейсы в функциональном программировании
- 2. Векторизация в функциональном программировании
- 3. тестирование в функциональном программировании
- 4. Условное «назначение» в функциональном программировании
- 5. Реализация состояний в функциональном программировании
- 6. бесконечный цикл в функциональном программировании?
- 7. Математические функции в функциональном программировании
- 8. Место закрытия в функциональном программировании
- 9. Зависимость впрыска в функциональном программировании
- 10. Что возвращает функция при «функциональном времени ноль» в функциональном программировании?
- 11. Понимание рекурсивных алгебраических типов в функциональном программировании
- 12. для vs map в функциональном программировании
- 13. Сложная функция в функциональном программировании javascript
- 14. Существуют ли «алгоритмы» в функциональном программировании?
- 15. Использование Stack & Queue в функциональном программировании (javascript)
- 16. свободные и связанные идентификаторы в функциональном программировании
- 17. Конструктивная сплошная геометрия в функциональном программировании
- 18. Пользовательская функция синуса в функциональном программировании
- 19. CS: равенство обещания в функциональном программировании
- 20. Обработка исключений в функциональном программировании Scala
- 21. Определение типа функции в функциональном программировании
- 22. Порядок выполнения функций в функциональном программировании
- 23. Что заменяет шаблон MVC в функциональном программировании?
- 24. Итерация с использованием счетчиков в функциональном программировании?
- 25. Кэширование потоков в функциональном реактивном программировании
- 26. Большие базы данных в функциональном программировании
- 27. Что такое бесплатный стиль в функциональном программировании?
- 28. условия гонки в чистом функциональном программировании
- 29. Совмещение раздвижного окна в функциональном программировании
- 30. Как реализовать счетчик в функциональном программировании
К сожалению, исследования структур данных и алгоритмов, наиболее подходящих для ленивых функциональных неизменяемых языков, отстают от этого для строгих императивных изменяемых языков. :-( – ephemient