La mayoría de los lenguajes funcionales utilizan listas vinculadas como su estructura de datos inmutable principal. ¿Por qué listas, y no, por ejemplo, árboles? Los árboles también pueden reutilizar rutas e incluso listas de modelos.
functional-programming
Filip Haglund
fuente
fuente
Respuestas:
Porque las listas son más simples que los árboles. (Puede ver esto trivialmente por el hecho de que una lista es un árbol degenerado, donde cada nodo tiene un solo hijo).
La lista de contras es la estructura de datos recursiva más simple posible de tamaño arbitrario.
Guy Steele argumentó durante el diseño del lenguaje de programación Fortress que para los cálculos masivamente paralelos del futuro, tanto nuestras estructuras de datos como nuestro flujo de control deben tener forma de árbol con múltiples ramas, no lineales como lo son ahora. Pero por el momento, la mayoría de nuestras bibliotecas de estructura de datos centrales se diseñaron con procesamiento secuencial e iterativo (o recursión de cola, en realidad no importa, son lo mismo) en mente, no procesamiento paralelo.
Tenga en cuenta que, por ejemplo, en Clojure, cuyas estructuras de datos se diseñaron específicamente para el mundo paralelo, distribuido y "nublado" de la actualidad, incluso las matrices (llamadas vectores en Clojure), probablemente la estructura de datos más "lineal" de todas, se implementan realmente como arboles
En resumen: una lista de contras es la estructura de datos recursiva persistente más simple posible, y no había necesidad de elegir un "valor predeterminado" más complicado. Por supuesto, otros están disponibles como opciones, por ejemplo, Haskell tiene matrices, colas de prioridad, mapas, montones, treaps, intentos y todo lo que puedas imaginar, pero el valor predeterminado es la simple lista de contras.
fuente
data Tree a = Leaf a | Branch a (Tree a) (Tree a)
. Esto refuerza su argumento de "simplicidad".Sequence
o Scala'sVector
), pero no usan árboles cuando solo necesitan leer, ya que pueden lograrlo en un tiempo constante y verdadero (por ejemplo, Haskell'sVector
o F # vía .Net'sImmutableArray
)pmap
ping sobre un vector en Clojure aún accede a cada elemento secuencialmente; La estructura de árbol del vector generalmente está oculta para el usuario final.En realidad, esas listas son árboles! Tiene nodos con dos campos
car
ycdr
que pueden contener más nodos u hojas. Lo único que convierte esos árboles en listas es la convención para interpretar elcdr
enlace como un enlace al siguiente nodo en una lista lineal, y elcar
enlace como el valor del nodo actual.Dicho esto, supongo que la prevalencia de las listas vinculadas en la programación funcional está vinculada a la prevalencia de la recursividad sobre la iteración. Cuando su única construcción de bucle en cuestión es la recursión (cola), desea estructuras de datos que sean fáciles de usar con eso; y las listas vinculadas son perfectas para eso.
fuente