Traté de buscar en Google para esto, pero todo lo que obtuve fueron historias sobre celebridades menores. Dada la falta de documentación, ¿qué es un DList?¿Qué es un DList?
Respuesta
Es una lista diferente, a lo largo de las líneas de "Difference List as functions"
scala> val (l1, l2, l3) = (List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
l1: List[Int] = List(1, 2, 3)
l2: List[Int] = List(4, 5, 6)
l3: List[Int] = List(7, 8, 9)
prepending eficiente:
scala> l1 ::: l2 ::: l3
res8: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
ineficiente adjuntas. Esto crea una lista intermedia (L1 L2 ++), entonces ((L1 L2 ++) ++ L3)
scala> l1 ++ l2 ++ l3 // inefficient
res9: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
DList
almacena hasta las anexa, y sólo necesita crear una lista completa, invocando de manera efectiva:
scala> List(l1, l2, l3) reduceRight (_ ::: _)
res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
No se está preponderando regularmente ¿Scala enumera con ::: todavía lineal en la longitud de los prefijos? ¿O hay algún código adicional que explota su inmutabilidad para hacerlo mejor? –
Con un 'DList', la operación total sigue siendo' O (n * m) ', donde' n' es el número de fragmentos y 'm' es el tamaño del fragmento. Con '++', la operación es 'O (n * n * m)' – retronym
Es un tipo de datos en el paquete no canónico scalaz, útil para listas tipadas con acceso de tiempo constante en ambos extremos. (El truco es Google de "Scala" AND "DLIST".)
Supuse que no era específico de scala –
Se encontró que DList desbordó la pila y se eliminó de Scalaz: http://code.google.com/p/scalaz/issues/detail? id = 19 –
@WillSargent DList se agregó de nuevo a Scalaz en 2011 https://github.com/scalaz/scalaz/commit/0c299ee4c15049310f2a5b229f46f5d5621d6702 –
Desde el project page of scalaz:
DList, un tipo de datos para la representación de elementos del mismo tipo con las operaciones append/Prepend de tiempo constantes.
el enlace ya no funciona :( – marios
listas de la diferencia son una estructura de datos-lista como que soporta operaciones O (1) append.
Añadir, y otras operaciones que modifican una lista se representan mediante la composición de funciones de las funciones de modificación, en lugar de copiar directamente la lista.
Un ejemplo, de Haskell's dlist library:
-- Lists as functions
newtype DList a = DL { unDL :: [a] -> [a] }
-- The empty list
empty = DL id
-- The append case: composition, a la Hughes
append xs ys = DL (unDL xs . unDL ys)
-- Converting to a regular list, linear time.
toList = ($[]) . unDL
La técnica se remonta al menos a Hughes 84, Una novela representación de las listas y su aplicación a la función "inverso", R. John Hughes, 1984. , donde, propone representar listas como funciones, y anexar como composición de funciones, permitiendo, por ejemplo, invertir para ejecutar en tiempo lineal. A partir del documento:
- 1. ¿Qué es un Pagelet?
- 2. ¿Qué es un UUID?
- 3. Qué es un Sandbox
- 4. ¿Qué es un antipatrón?
- 5. ¿Qué es un índice?
- 6. ¿Qué es un lote?
- 7. ¿Qué es un "mango"?
- 8. ¿Qué es un textViewResourceId?
- 9. ¿Qué es un clabject?
- 10. ¿Qué es un dll?
- 11. ¿Qué es un protocolo?
- 12. ¿Qué es un tipo?
- 13. ¿Qué es un contexto?
- 14. ¿Qué es un descriptor?
- 15. ¿Qué es un invariante?
- 16. ¿Qué es un classpath?
- 17. ¿Qué es un Lambda?
- 18. ¿Qué es un despachador
- 19. ¿Qué es un blob?
- 20. ¿Qué es un runloop?
- 21. ¿Qué es un historiador?
- 22. ¿Qué es un UIViewController
- 23. Qué es un componente
- 24. ¿Qué es un SSTable?
- 25. ¿Qué es un NSCFDiccionario?
- 26. ¿Qué es un NSPathStore2?
- 27. ¿Qué es un javabean?
- 28. ¿Qué es un Rakefile?
- 29. ¿Qué es un UIGobblerGestureRecognizer?
- 30. ¿Qué es un PDI y qué significa?
sólo hace clic sobre esta cuestión para tener la oportunidad de hacer un comentario jocoso acerca de las celebridades. Pero ya estaba allí en la pregunta ... +1 –