Я помітив, що більшість функціональних мов використовують єдиний зв'язаний список (список "проти") як їх найбільш фундаментальний тип списку. Приклади включають звичайні Lisp, Haskell і F #. Це відрізняється від основних мов, де типом власного списку є масиви.
Чому так?
Для Common Lisp (динамічно набраний) я розумію, що мінуси є загальними, щоб бути також базою списків, дерев тощо. Це може бути крихітною причиною.
Для мов, що мають статичний тип, я не можу знайти належних міркувань, я навіть можу знайти аргументи:
- Функціональний стиль заохочує незмінність, тому простота вставки пов'язаного списку є меншою перевагою,
- Функціональний стиль заохочує незмінність, а також обмін даними; масив легше ділитися "частково", ніж пов'язаний список,
- Ви також можете зробити відповідність шаблонів у звичайному масиві так само добре, а ще краще (ви можете легко скласти справа наліво, наприклад),
- Крім того, ви отримуєте випадковий доступ безкоштовно,
- І (практична перевага), якщо мова введена статично, ви можете використовувати звичайний макет пам'яті та отримувати збільшення швидкості з кешу.
То чому б віддавати перевагу зв'язаним спискам?
an array is easier to share "partially" than a linked list
потрібно уточнити, що ви маєте на увазі. Зважаючи на їх рекурсивну природу, навпаки, наскільки я розумію, ви можете частково поділитися пов'язаним списком, пройшовши уздовж будь-якого вузла в ньому, тоді як масиву потрібно буде витратити час на створення нової копії. Або з точки зору обміну даними, два пов'язані списки можуть вказувати на один і той же суфікс, що просто просто неможливо з масивами.