2014-10-11 1 views
5

Sto trasferendo un codice imperativo a Haskell. Il mio obiettivo è analizzare un eseguibile, quindi ad ogni byte della sezione di testo viene assegnato un numero di flag, che si inseriscono tutti in un byte (6 bit per la precisione).Quale struttura dati per una matrice di bit di bit?

In un linguaggio come C, vorrei semplicemente allocare una serie di byte, azzerarli e aggiornarli mentre procedo. Come lo farei in modo efficiente in Haskell?

In altre parole: Sto cercando un ByteString con accesso bit-saggio e aggiornamenti a tempo costante mentre disassembro più sezioni di testo.

Modifica: Ovviamente, qualsiasi tipo di struttura di altri dati farebbe se fosse altrettanto efficiente.

risposta

6

È possibile utilizzare un vettore con qualsiasi tipo di dati che sia un'istanza di Bits typeclass, ad esempio Word64 per 64 bit per elemento nel vettore. Utilizzare un vettore unbox se si desidera che l'array sia contiguo nella memoria.

9

L'implementazione per gli array unboxed di Bool -s in array è un bitarray compresso. È possibile eseguire aggiornamenti mutabili su tali array nello ST Monad (questo è essenzialmente lo stesso comportamento di runtime di C).

+0

Queste sono entrambe ottime risposte, ma penso di andare con gspr's perché mi sembra più idiomatico. –

+0

@Sebastian: 'vector' non impacchetta Bool-s in bit, quindi è necessario scrivere il proprio wrapper se si desidera leggere/scrivere bit specifici. La maggior parte delle volte 'vector' è una scelta migliore a causa dell'API più ricca, ma qui' array' è probabilmente più semplice. –

+1

Penso che assegnerò comunque un byte per ogni elemento, perché I * think * sarebbe più performante da una prospettiva di accesso agli elementi. Inoltre, sembra che implementare le mie bandiere in cima a "Bits" sia in qualche modo più comodo di 6 'Bool' consecutivi, tuttavia ciò potrebbe essere soggettivo. –