Najpierw jestem nowicjuszem Haskell. Przeczytałem to: Immutable functional objects in highly mutable domain Moje pytanie jest prawie takie samo - jak wydajnie pisać algorytmy, w których stan ma się zmienić. Weźmy na przykład algorytm Dijkstry. Zostaną znalezione nowe ścieżki, a odległości powinny zostać zaktualizowane. W tradycyjnych językach jest to proste, podczas gdy w Haskell na przykład mogę myśleć tylko o stworzeniu zupełnie nowych odległości, które będą zbyt wolne i będą pochłaniały pamięć. Czy są takie wzorce projektowe dla takich przypadków, w których należy wdrożyć algorytm z zmienną strukturą danych, a szybkość i wykorzystanie pamięci są głównymi problemami?Mutowalność w programowaniu funkcjonalnym
Odpowiedz
Istnieje oczywiście wiele sposobów na rozwiązywanie tego problemu przez języki funkcjonalne.
Różne struktury danych - struktury wiele danych mogą być realizowane w czysto funkcjonalnego sposób, z tym samym algorytmicznej złożoności jako wersje nadrzędnymi. Prawdopodobnie najbardziej znanym dziełem w tym obszarze jest Chris Okasaki Purely Functional Data Structures, ale jest też wiele innych zasobów. Dla algorytmu Dijkstry odpowiednia jest praca Martin Erwig pod numerem functional graphs. Zobacz także this question.
Różne algorytmy - niektóre algorytmy mają założenia wbudowanej zmienności, Quicksort jest tego przykładem. W takim przypadku można zastosować alternatywny algorytm, który jest bardziej podatny na niezmienność.
Stan zmutowalny - każdy język funkcyjny może modelować stan funkcjonalny z monadą państwową. Większość dostarcza także innych form zmienności, takich jak moneta Haskella i IORef.
Urządzenie ST Monad umożliwia wewnętrznie używanie stanu zmiennego, ale przedstawia wyłącznie interfejs zewnętrzny.
Tworzenie nowych niezmiennych obiektów nie jest prawie takim samym kosztem, jak mogłoby się wydawać, ponieważ duże ilości współdzielenia strukturalnego mogą wystąpić, ponieważ kompilator wie, że nie może się zmienić, a zatem może być bezpiecznie udostępniony. To powiedziawszy, użycie wysoce imperatywnych algorytmów z dużą ilością zmiennego stanu w Haskell to trochę zakodowany kod.
W pochodnych ML (takich jak OCaml, SML, F #) istnieją "referencje", które można wykorzystać jako zmienne zmienne.
W Haskell nie jest to obsługiwane w czysty sposób. Państwo po prostu nie jest objęte zwykłym stylem "czysto funkcjonalnym". Czyste języki FP radzą sobie z "odwiecznymi prawdami" i dlatego nie nadają się do pracy z "efemerycznymi prawdami" (choć można to z całą pewnością zrobić).
Jednak tak, czasami potrzebujemy zmiennego stanu. Język taki jak ATS zawiera typy liniowe do obsługi destrukcyjnych aktualizacji i bezpiecznej manipulacji zasobami.
- 1. Zrozumienie sekwencjonowania w programowaniu funkcjonalnym
- 2. podpisy/typy w programowaniu funkcjonalnym (OCaml)
- 3. Domain Driven Design w programowaniu funkcjonalnym?
- 4. Określanie typu funkcji w Programowaniu funkcjonalnym
- 5. Dlaczego powinienem używać funktory aplikacyjne w programowaniu funkcjonalnym?
- 6. Czy wszystkie czyste funkcje w programowaniu funkcjonalnym są ciągłe?
- 7. Cel trzeciego argumentu funkcji "zmniejszania" w programowaniu funkcjonalnym Java 8
- 8. Jakiej techniki w programowaniu funkcjonalnym trudno się nauczyć, ale później przydatna?
- 9. Czy istnieje pojęcie "fold with break" lub "find with accumulator" w programowaniu funkcjonalnym?
- 10. Filtr sekwencji F # w funkcjonalnym stylu
- 11. PropTypes w funkcjonalnym elemencie bezstanowym
- 12. Redukcje w programowaniu
- 13. [: Nieoczekiwany operator w programowaniu powłoki
- 14. Co oznacza "pakowanie" w programowaniu?
- 15. użyj dplyr mutate() w programowaniu
- 16. Używanie filtra dplyr() w programowaniu
- 17. Funkcja htons() w programowaniu gniazd
- 18. η-ekspansja w czystym języku funkcjonalnym
- 19. O programowaniu stylu funkcjonalnego
- 20. Kowariancja w programowaniu na poziomie typu
- 21. Jak używać hash SHA1 w programowaniu C
- 22. Jakie matematyczne dualy są w programowaniu OO?
- 23. Prośba o dobre tutoriale w programowaniu dll
- 24. Używanie klas użytkowych w programowaniu Android
- 25. Co robi "eksportowanie" w programowaniu powłoki?
- 26. Co oznacza termin "blokowanie" w programowaniu?
- 27. Co SOMAXCONN oznacza w programowaniu gniazd C?
- 28. SDL vs GLUT w programowaniu 3D OpenGL
- 29. Jak uruchomić JavaScript w programowaniu Java
- 30. Jak uniknąć ucieczki% w programowaniu piśmiennictwa?
Niestety, badania nad strukturami danych i algorytmami, które najlepiej nadają się do leniwych, niezmiennych języków funkcjonalnych, pozostają w tyle za ścisłymi wymagającymi zmiennymi językami. :-( – ephemient