2011-11-14 14 views
21

Quali librerie esistono che implementano strutture di dati rigide? Nello specifico, sto cercando liste rigide e set severi.Librerie per strutture dati rigide in Haskell

Avvertenze:

  1. Sono consapevole delle deepseq. È molto utile, ma aggiunge il sovraccarico di attraversare l'intera struttura dei dati ogni volta che usi deepseq (che potrebbe essere più di una volta).

  2. Sono consapevole che una rigida struttura di dati a contenitore non si garantire tutto ciò che contiene sarà pienamente valutato, ma la struttura stesso dovrebbe essere rigorosi, ad esempio:

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

    (Qui, la gli elementi contenuti sono in WHNF, e forse non completamente valutati, ma la struttura della lista è. Ad esempio, gli elenchi infiniti saranno valori non terminanti)

  3. Conosco il pacchetto "strict" su hackage, ma ha un limite molto d set di rigide strutture di dati. Non contiene né rigidi elenchi né set.

  4. scrivere liste severe me sembra incredibilmente facile (mi piace estensioni di ghc derivare Functor, Traversable e pieghevole, btw.), Ma sembra ancora come sarebbe meglio fatto in una libreria separata. E implementazioni efficienti di insiemi non mi sembrano così banali.

+0

Perché hai bisogno di una struttura rigida? – fuz

+1

@FUZxxl assicurando che le cose vengano valutate senza ritardo può spesso ridurre l'utilizzo dello spazio e rendere i calcoli molto più veloci. Può anche avere l'effetto opposto, quindi anche le strutture pigre sono importanti. Per un codice efficiente, hai bisogno di entrambi (e devi sapere/scoprire quale usare dove). –

+0

@FUZxxl: stavo facendo cose tipo monad di stato su un Set in cui inserivo e cancellavo elementi dal set molto spesso, ma non valutavo il Set per un po 'di tempo. Ciò ha provocato una perdita di spazio, che potrebbe essere risolta mediante strutture di dati spin-strict (grazie, John L). – shahn

risposta

13

Il containers pacchetto (fornito con GHC) avranno presto rigida serie e Mappa varianti (non sono sicuro che saranno incluse con GHC-7.4, ma non c'è motivo di sperare). Quindi è in arrivo un'implementazione efficiente di Set e Maps rigidi. Gli elenchi rigidi sono, come dici tu, ancora un pacchetto su hackage che li fornisce sarebbe bello, quindi non tutti devono farlo da soli. Cos'altro ti serve?

+0

Sembra fantastico.Elenchi e set sono tutto ciò di cui ho bisogno (per ora). – shahn

7

Per il secondo punto, il termine che ho visto più spesso è spinoso.

Per un elenco rigoroso della colonna vertebrale, è possibile utilizzare probabilmente Data.Seq.Sequence (da contenitori) o Data.Vector (da vector). Nessuno dei due è un elenco, tuttavia a seconda di ciò che si sta facendo uno (o entrambi) è probabile che sia migliore. Sequence fornisce O (1) cons e snoc, con un accesso molto veloce a entrambe le estremità della struttura. Le prestazioni di Vector sono simili a quelle di un array. Se vuoi un'interfaccia più simile a Sequence, potresti prendere in considerazione il pacchetto ListLike (c'è anche un'interfaccia ListLike per i vettori, ma è meno utile perché Vector fornisce un'interfaccia abbastanza completa da sola). Entrambi sono rigorosi alla spina dorsale.

Per set rigorosi, è possibile provare unordered-containers, che fornisce anche una mappa rigorosa.

+0

Questo è un buon consiglio. – shahn

+1

Media spinale: gli elementi verranno valutati in WHNF (come nell'esempio precedente di StrictList)? Quindi, potresti rimuovere il primo punto esclamativo e chiamarlo ancora strict-strict? – shahn

+1

@shahn: spine-strict significa che la struttura del contenitore sarà completamente valutata, ma gli elementi potrebbero non essere affatto valutati. Quindi sì, è possibile rimuovere il primo punto esclamativo nell'esempio ed essere ancora severamente severi. –