J'ai remarqué que la plupart des langages fonctionnels utilisent une liste à liaison unique (une liste "contre") comme types de liste les plus fondamentaux. Les exemples incluent Common Lisp, Haskell et F #. Ceci est différent des langages traditionnels, où les types de liste natifs sont des tableaux.
Pourquoi donc?
Pour Common Lisp (étant typé dynamiquement), j'ai l'idée que les inconvénients sont suffisamment généraux pour être également la base de listes, d'arbres, etc. Cela pourrait être une toute petite raison.
Pour les langages typés statiquement, cependant, je ne trouve pas de bon raisonnement, je peux même trouver des contre-arguments:
- Le style fonctionnel encourage l'immuabilité, la facilité d'insertion de la liste chaînée est donc moins avantageuse,
- Le style fonctionnel encourage l'immuabilité, ainsi que le partage de données; un tableau est plus facile à partager "partiellement" qu'une liste chaînée,
- Vous pouvez aussi bien faire correspondre des motifs sur un tableau régulier, et encore mieux (vous pouvez facilement vous plier de droite à gauche par exemple),
- En plus de cela, vous obtenez un accès aléatoire gratuit,
- Et (un avantage pratique) si la langue est typée statiquement, vous pouvez utiliser une disposition de mémoire régulière et obtenir une augmentation de la vitesse du cache.
Alors pourquoi préférer les listes chaînées?
an array is easier to share "partially" than a linked list
faut clarifier ce que vous voulez dire. En raison de leur nature récursive, l'inverse est vrai si je comprends bien - vous pouvez partager partiellement une liste liée plus facilement en passant le long de n'importe quel nœud, tandis qu'un tableau aurait besoin de passer du temps à faire une nouvelle copie. Ou en termes de partage de données, deux listes liées peuvent pointer vers le même suffixe, ce qui n'est tout simplement pas possible avec les tableaux.