Zauważyłem, że większość języków funkcjonalnych wykorzystuje listę pojedynczo połączoną (listę „wad”) jako najbardziej podstawowe typy list. Przykłady obejmują Common Lisp, Haskell i F #. Różni się to od języków głównego nurtu, w których rodzimymi typami list są tablice.
Dlaczego?
W przypadku Common Lisp (dynamicznie wpisywanego) mam wrażenie, że minusy są na tyle ogólne, że mogą być również podstawą list, drzew itp. To może być mały powód.
Jednak w przypadku języków o typie statycznym nie mogę znaleźć dobrego uzasadnienia, mogę nawet znaleźć kontrargumenty:
- Funkcjonalny styl zachęca do niezmienności, więc łatwość wstawiania połączonej listy jest mniej korzystna,
- Funkcjonalny styl zachęca do niezmienności, a więc także do udostępniania danych; tablica jest łatwiejsza do dzielenia się „częściowo” niż lista połączona,
- Równie dobrze możesz dopasowywać wzorce na zwykłej tablicy, a nawet lepiej (możesz na przykład łatwo spasować od prawej do lewej),
- Ponadto otrzymasz losowy dostęp za darmo,
- I (praktyczna zaleta), jeśli język jest wpisany statycznie, możesz zastosować regularny układ pamięci i uzyskać zwiększenie prędkości z pamięci podręcznej.
Dlaczego więc wolisz powiązane listy?
an array is easier to share "partially" than a linked list
należy wyjaśnić, co masz na myśli. Ze względu na ich rekurencyjny charakter, odwrotnie jest tak, jak rozumiem - możesz częściowo udostępnić połączoną listę, przechodząc przez dowolny węzeł, a tablica musiałaby spędzać czas na tworzeniu nowej kopii. Jeśli chodzi o udostępnianie danych, dwie połączone listy mogą wskazywać ten sam sufiks, co po prostu nie jest możliwe w przypadku tablic.