2011-11-14 9 views
21

¿Qué bibliotecas existen que implementan estructuras de datos estrictas? Específicamente, estoy buscando listas estrictas y conjuntos estrictos.Bibliotecas para estructuras de datos estrictas en Haskell

Aviso legal:

  1. soy consciente de deepseq. Es muy útil, pero agrega la sobrecarga de atravesar toda la estructura de datos cada vez que usa deepseq (que puede ser más de una vez).

  2. Soy consciente de que una estructura de datos tipo contenedor estricta no garantizar todo lo que contiene será evaluado completamente, pero la estructura sí debe ser estricta, por ejemplo:

    data StrictList a = !a :$ !(StrictList a) | Empty 
    

    (Aquí, el los elementos contenidos están en WHNF, y posiblemente no se evalúan por completo, pero la estructura de la lista es. Por ejemplo, las listas infinitas serán valores no terminadores.)

  3. Conozco el paquete 'estricto' sobre pirateo, pero tiene un límite muy d conjunto de estructuras de datos estrictas. No contiene listas ni conjuntos estrictos .

  4. escribir listas estrictas mismo parece sorprendentemente fácil (me encanta extensiones de GHC para derivar Functor, de Traversable y plegable, por cierto.), Pero todavía parece que sería mejor hacerlo en una biblioteca independiente. Y implementaciones eficientes de conjuntos no me parecen tan triviales.

+0

¿Por qué necesita una estructura estricta? – fuz

+1

@FUZxxl asegurando que las cosas se evalúan sin demora a menudo puede reducir el uso de espacio y hacer cálculos mucho más rápido. También puede tener el efecto inverso, por lo que las estructuras perezosas también son importantes. Para un código eficiente, necesita ambos (y debe saber/averiguar cuál usar dónde). –

+0

@FUZxxl: Estaba haciendo cosas parecidas a una mónada de estado en un conjunto en el que insertaba y eliminaba elementos del conjunto muy a menudo, pero no evaluaba el conjunto durante un tiempo. Esto dio lugar a una fuga de espacio, que podría ser arreglada por estructuras de datos rigurosas (gracias, John L). – shahn

Respuesta

13

El containers paquete (incluido con GHC) pronto tendrá estrictas establecidas y Mapa variantes (no estoy seguro de que van a ser incluidos con GHC-7.4, pero no hay razón para esperar). Por lo tanto, una implementación eficiente de conjuntos y mapas estrictos está en camino. Las listas estrictas son, como dices fáciles, aún un paquete en hackage que las proporciona sería bueno, por lo que no todo el mundo tiene que hacerlo por sí mismo. Que más necesitas?

+0

Suena genial.Las listas y los conjuntos son todo lo que necesito (por ahora). – shahn

7

Para su segundo punto, el término que he visto con mayor frecuencia es riguroso.

Para una lista rigurosa, probablemente podría usar Data.Seq.Sequence (de contenedores) o Data.Vector (de vector). Ninguno de los dos es una lista, sin embargo, dependiendo de lo que esté haciendo, uno (o ambos) es probable que sea mejor. La secuencia proporciona O (1) contras y snoc, con acceso muy rápido a cualquier extremo de la estructura. El rendimiento de Vector es similar a una matriz. Si desea una interfaz más similar a la lista para Sequence, puede considerar el paquete ListLike (también hay una interfaz ListLike para vectores, pero es menos útil porque Vector proporciona una interfaz bastante completa por sí misma). Ambos son estrictos.

Para conjuntos estrictos, puede probar unordered-containers, que también proporciona un mapa estricto.

+0

Eso es un buen consejo. – shahn

+1

¿Significa Spine-strict que los elementos se evaluarán en WHNF (como en mi ejemplo de StrictList más arriba)? Entonces, ¿podrías eliminar el primer signo de exclamación y aún así llamarlo estricto? – shahn

+1

@shahn: spine-strict significa que la estructura del contenedor será evaluada completamente, pero los elementos pueden no ser evaluados en absoluto. Entonces, sí, puedes eliminar el primer signo de exclamación en tu ejemplo y seguir siendo estricto. –

Cuestiones relacionadas