Percebi que a maioria das linguagens funcionais emprega uma lista vinculada individual (uma lista de "contras") como seus tipos de lista mais fundamentais. Exemplos incluem Common Lisp, Haskell e F #. Isso é diferente dos idiomas principais, onde os tipos de lista nativos são matrizes.
Por que é que?
Para o Common Lisp (sendo digitado dinamicamente), tenho a ideia de que os contras são gerais o suficiente para também serem a base de listas, árvores etc. Isso pode ser uma pequena razão.
Para linguagens de tipo estaticamente, no entanto, não consigo encontrar um bom raciocínio, posso até encontrar contra-argumentos:
- O estilo funcional incentiva a imutabilidade; portanto, a facilidade de inserção da lista vinculada é menos uma vantagem,
- O estilo funcional incentiva a imutabilidade, assim como o compartilhamento de dados; é mais fácil compartilhar "parcialmente" que uma lista vinculada,
- Você também pode fazer a correspondência de padrões em uma matriz regular e ainda melhor (você pode facilmente dobrar da direita para a esquerda, por exemplo),
- Além disso, você obtém acesso aleatório gratuitamente,
- E (uma vantagem prática) se o idioma for digitado estaticamente, você poderá empregar um layout de memória regular e obter um aumento de velocidade no cache.
Então, por que preferir listas vinculadas?
an array is easier to share "partially" than a linked list
precisa de esclarecimentos sobre o que você quer dizer. Devido à sua natureza recursiva, o oposto é verdadeiro como eu o entendo - você pode compartilhar parcialmente uma lista vinculada mais facilmente passando qualquer nó nela, enquanto uma matriz precisaria gastar tempo fazendo uma nova cópia. Ou em termos de compartilhamento de dados, duas listas vinculadas podem apontar para o mesmo sufixo, o que simplesmente não é possível com matrizes.