web-dev-qa-db-fra.com

Pourquoi les listes sont-elles la structure de données de choix dans les langages fonctionnels?

La plupart des langages fonctionnels utilisent des listes liées comme structure de données immuable principale. Pourquoi les listes, et non par exemple des arbres? Les arbres peuvent également réutiliser des chemins et même des listes de modèles.

45
Filip Haglund

Parce que les listes sont plus simples que les arbres. (Vous pouvez voir cela trivialement par le fait qu'une liste est un arbre dégénéré, où chaque nœud n'a qu'un seul enfant.)

La liste des inconvénients est la structure de données récursive la plus simple possible de taille arbitraire.

Guy Steele a soutenu lors de la conception du langage de programmation Fortress que pour les calculs massivement parallèles du futur, nos structures de données et notre flux de contrôle devraient être en forme d'arbre avec plusieurs branches, et non linéaires comme ils le sont maintenant. Mais pour l'instant, la plupart de nos bibliothèques de structure de données de base ont été conçues avec un traitement séquentiel et itératif (ou récursivité de queue, cela n'a pas vraiment d'importance, c'est la même chose) à l'esprit, pas de traitement parallèle.

Notez que par ex. à Clojure, dont les structures de données ont été conçues spécifiquement pour le monde parallèle, distribué et "nuageux" d'aujourd'hui, même les tableaux (appelés vecteurs dans Clojure), probablement la structure de données la plus "linéaire" de tous, sont en fait implémentés sous forme d'arbres.

Donc, en bref: une liste des inconvénients est la structure de données récursive persistante la plus simple possible, et il n'était pas nécessaire de choisir une "valeur par défaut" plus compliquée. D'autres sont bien sûr disponibles en option, par ex. Haskell a des tableaux, des files d'attente prioritaires, des cartes, des tas, des treaps, des essais et tout ce que vous pourriez imaginer, mais la valeur par défaut est la simple liste des inconvénients.

57
Jörg W Mittag

En fait, ces listes sont des arbres! Vous avez des nœuds avec deux champs, car et cdr, qui peuvent contenir plusieurs de ces nœuds ou feuilles. La seule chose qui transforme ces arbres en listes est la convention de interpréter le lien cdr comme lien vers le nœud suivant dans une liste linéaire, et le car lien comme valeur du nœud actuel.

Cela dit, je suppose que la prévalence des listes chaînées dans la programmation fonctionnelle est liée à la prévalence de la récursivité sur l'itération. Lorsque votre seule construction de bouclage à portée de main est la récursion (de queue), vous voulez des structures de données faciles à utiliser avec cela; et les listes chaînées sont parfaites pour cela.