Я заметил, что большинство функциональных языков используют односвязный список (список «минусов») в качестве наиболее фундаментальных типов списков. Примеры включают Common Lisp, Haskell и F #. Это отличается от основных языков, где родные типы списков являются массивами.
Почему это?
Для Common Lisp (будучи динамически типизированным) я понял, что минусы достаточно общие, чтобы также быть основой списков, деревьев и т. Д. Это может быть крошечной причиной.
Однако для статически типизированных языков я не могу найти веских аргументов, я даже могу найти контраргументы:
- Функциональный стиль поощряет неизменность, поэтому простота вставки связанного списка является меньшим преимуществом,
- Функциональный стиль поощряет неизменность, а также обмен данными; массив легче разделить «частично», чем связанный список,
- Вы можете сделать сопоставление с образцом для обычного массива точно так же, и даже лучше (например, вы можете легко сложить справа налево),
- Кроме того, вы получаете произвольный доступ бесплатно,
- И (практическое преимущество), если язык статически типизирован, вы можете использовать обычную структуру памяти и получить повышение скорости из кеша.
Так почему же предпочитаете связанные списки?
an array is easier to share "partially" than a linked list
нужно уточнить, что вы имеете в виду. Из-за их рекурсивного характера, как я понимаю, верно обратное: вы можете частично поделиться связанным списком, передавая любой узел в нем, в то время как массиву потребуется потратить время на создание новой копии. Или с точки зрения совместного использования данных, два связанных списка могут указывать на один и тот же суффикс, что просто невозможно с массивами.