Jakie są korzyści z czysto funkcjonalnej struktury danych?

Istnieje duża liczba tekstów na temat struktur danych oraz bibliotek kodu struktur danych. Rozumiem, że czysto funkcjonalna struktura danych jest łatwiejsza do rozumowania. Mam jednak problem ze zrozumieniem rzeczywistej przewagi wykorzystania czysto funkcjonalnej struktury danych w kodzie pragmatycznym (używając funkcjonalnego języka programowania lub nie) nad imperatywnym odpowiednikiem. Czy ktoś może podać jakieś realne przypadki, w których czysto funkcjonalna struktura danych ma przewagę i dlaczego?

Przykłady wzdłuż linii, jak używam data_structure_name w programming_language do wykonywania aplikacji ponieważ może ona wykonywać certain_thing .

Dzięki.

PS: to, co mam na myśli przez czysto funkcjonalną strukturę danych, nie jest tym samym, co trwała struktura danych. Trwała struktura danych to struktura danych, która się nie zmienia?? Z drugiej strony czysto funkcjonalna struktura danych jest strukturą danych, która działa czysto.

Author: leon , 2010-12-09

5 answers

Czysto funkcjonalne (aka trwałe lub niezmienne) struktury danych dają kilka zalet:

  • nigdy nie trzeba ich blokować, co bardzo poprawia współbieżność .
  • mogą współdzielić strukturę, cozmniejsza zużycie pamięci . Na przykład, rozważmy list [1, 2, 3, 4] w języku Haskell i niektórych imperatywnych językach, takich jak Java. Aby stworzyć nową listę w Haskell wystarczy utworzyć nową cons (parę wartości i reference-to-next-element) i podłączyć ją do poprzednia lista. W Javie trzeba utworzyć zupełnie nową listę, aby nie uszkodzić poprzedniej.
  • możesz tworzyć trwałe struktury danychlazy.
  • ponadto, jeśli używasz stylu funkcjonalnego, możesz unikać myślenia o czasie i sekwencji operacji , dzięki czemu Twoje programy stają się bardziej deklaratywne.
  • fakt, że struktura danych jest niezmienna, pozwala na zrobienie kilku dodatkowych założeń i tym samym rozszerzyć możliwości języka . Na przykład, Clojure używa faktu niezmienności, aby poprawnie dostarczyć implementacje metody hashCode() na każdym obiekcie, więc każdy obiekt może być użyty jako klucz na mapie.
  • z niezmiennymi danymi i funkcjonalnym stylem możesz również swobodnie korzystać memoizacja.
Jest o wiele więcej zalet, ogólnie rzecz biorąc, jest to inny sposób modelowania świata rzeczywistego. Ten i kilka innych rozdziałów z SICP da ci dokładniejszy widok programowania z niezmienne struktury, jego zalety i wady.
 70
Author: ffriend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 16:11:39

Oprócz bezpieczeństwa pamięci współdzielonej większość czysto funkcyjnych struktur danych daje również trwałość i praktycznie za darmo. Na przykład, powiedzmy, że mam set w OCaml, i chcę dodać do niego kilka nowych wartości, mogę to zrobić:

module CharSet = Set.Make(Char)
let a = List.fold_right CharSet.add ['a';'b';'c';'d'] CharSet.empty in
let b = List.fold_right CharSet.add ['e';'f';'g';'h'] a in
...

a pozostaje niezmodyfikowane po dodaniu nowych znaków (zawiera tylko A-d), podczas gdy b zawiera a-h i dzielą część tej samej pamięci (z set jest trochę trudno powiedzieć, ile pamięci jest współdzielone od jest to drzewo AVL i kształt drzewa się zmienia). Mogę nadal to robić, śledząc wszystkie zmiany, które wprowadziłem w drzewie, pozwalając mi wrócić do poprzedniego stanu.

Oto wielki diagram z artykułu Wikipedii na temat czysto funkcjonalnych, który pokazuje wyniki wstawiania znaku " e " do drzewa binarnego xs:

alt text

 24
Author: Niki Yoshiuchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 16:18:23

Programy Erlang używają czysto funkcjonalnych struktur danych niemal wyłącznie i czerpią znaczne korzyści, skalując je niemal płynnie do wielu rdzeni. Ponieważ współdzielone dane (głównie binaria i ciągi bitowe) nigdy nie są modyfikowane, nigdy nie ma potrzeby blokowania takich danych.

 14
Author: Marcelo Cantos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 15:30:17

Weź ten mały fragment F#:

let numbers = [1; 2; 3; 4; 5]

Można powiedzieć ze 100% pewnością, że jest to niezmienna lista liczb całkowitych od 1 do 5. Możesz przekazać odniesienie do tej listy i nigdy nie musisz się martwić, że lista mogła zostać zmodyfikowana. To wystarczający powód, by go użyć.

 9
Author: ChaosPandion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 15:37:29

Czysto funkcjonalne struktury danych mają następujące zalety:

  • Trwałość: stare wersje mogą być bezpiecznie używane ze świadomością, że nie mogły zostać zmienione.

  • Udostępnianie: wiele wersji struktury danych może być przechowywanych jednocześnie przy niewielkich wymaganiach dotyczących pamięci.

  • Bezpieczeństwo wątku: każda mutacja jest ukryta wewnątrz lazy thunks (jeśli istnieje) i dlatego jest obsługiwana przez implementację języka.

  • Prostota: brak konieczności śledzenia zmian stanu sprawia, że czysto funkcjonalne struktury danych są prostsze w użyciu, szczególnie w kontekście współbieżności.

  • Inkrementalność: czysto funkcjonalne struktury danych składają się z wielu drobnych części, co czyni je idealnymi do przyrostowego zbierania śmieci, co prowadzi do mniejszych opóźnień.

Zauważ, że nie wymieniłem paralelizmu jako przewagi czysto funkcjonalnych struktur danych, ponieważ nie sądzę, aby tak było. Wydajny równoległość wielordzeniowa wymaga przewidywalnej lokalizacji w celu wykorzystania pamięci podręcznej i uniknięcia wąskiego gardła w dostępie do pamięci głównej, a czysto funkcjonalne struktury danych mają w najlepszym razie nieznane Cechy pod tym względem. W związku z tym wiele programów, które używają czysto funkcjonalnych struktur danych, nie skaluje się dobrze, gdy są równoległe do wielordzeniowego, ponieważ cały swój czas spędzają w pamięci podręcznej, walcząc o wspólne ścieżki pamięci.

Co mam na myśli mówiąc czysto funkcjonalna struktura danych nie jest taka sama jak struktura danych trwałych.

Jest tu trochę zamieszania. W kontekście czysto funkcjonalnych struktur danych, trwałość jest terminem używanym w odniesieniu do możliwości odwoływania się do poprzednich wersji struktury danych bezpiecznych ze świadomością, że są one nadal ważne. Jest to naturalny wynik bycia czysto funkcjonalnym, a zatem trwałość jest nieodłączną cechą wszystkich czysto funkcjonalnych struktur danych.

 8
Author: Jon Harrop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-25 22:45:33