Obecnie gram w LISP (szczególnie Scheme i Clojure) i zastanawiam się, jak radzą sobie typowe struktury danych w funkcjonalnych językach programowania.
Na przykład, powiedzmy, że chciałbym rozwiązać problem za pomocą algorytmu znajdowania ścieżki wykresu. Jak można zazwyczaj przedstawiać ten wykres w funkcjonalnym języku programowania (przede wszystkim zainteresowany czystym stylem funkcjonalnym, który można zastosować w LISP)? Czy po prostu zapomnę o grafach i rozwiązam problem w inny sposób?
Języki funkcjonalne traktują struktury danych w taki sam sposób jak języki niefunkcjonalne: oddzielając interfejs od implementacji, tworząc abstrakcyjne typy danych.
Możesz tworzyć abstrakcyjne typy danych w Lisp. Na przykład dla wykresu możesz chcieć mieć kilka funkcji:
Po utworzeniu tego interfejsu do wykresu możesz zaimplementować faktyczne struktury danych na wiele różnych sposobów, optymalizując takie czynniki, jak wydajność programisty, elastyczność i wydajność obliczeniowa.
Kluczem jest upewnienie się, że kod korzystający z grafów korzysta tylko z interfejsu grafów i nie ma dostępu do podstawowej implementacji. Dzięki temu kod klienta będzie prostszy, ponieważ zostanie odłączony od faktycznej implementacji.
źródło
Cóż, zależy to od tego, czy Twój wykres jest skierowany / niekierowany, ważony / nieważony, ale jednym ze sposobów przedstawienia ukierunkowanego, ważonego wykresu (który byłby najbardziej ogólny) jest mapa map (w Clojure)
reprezentuje mapę z węzłami: a: b i: c. : a wskazuje na: b o wadze 3 i: c o wadze 4.: b wskazuje na: a o wadze 1.: c nie wskazuje na nic.
źródło
W Common Lisp, gdybym musiał reprezentować drzewo, użyłbym albo listy (jeśli to tylko szybki hack), albo zdefiniowałbym klasę drzewa (lub struct, ale klasy dobrze współdziałają z funkcjami ogólnymi, więc czemu nie) .
Gdybym potrzebował dosłownych drzew w kodzie, prawdopodobnie zdefiniowałbym również
make-tree
funkcję, która pobiera reprezentację listy drzewa, którą chcę, i zamienia ją w drzewo obiektów drzewa.źródło
W Haskell lista jest podstawową strukturą danych i jeśli chcesz bardziej zaawansowanych struktur danych, często używasz struktur rekurencyjnych, np. Drzewo ma wartość null lub węzeł i dwa drzewa
źródło