2012-11-28 8 views
5

Non riesco a trovare risorse valide che funzionino su come rendere i miei tipi di dati unboxed, da utilizzare in un vettore unbox. Come posso creare il tipo di datiCome posso creare un'istanza di unbox di un ADT?

data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq) 

essere un esempio di Unbox?

Edit: dopo aver spulciato un po 'di più, sembra che obbligando i parametri in alcune funzioni a essere rigidi, posso convincere GHC a cancellarli automaticamente. Se applicabile nel mio caso? Come faccio a sapere quali paramateri rendere rigorosi?

+0

Hai guardato [questa risposta] (http://stackoverflow.com/a/10866718)? – Fixnum

+0

Sì, GHCi mi ha detto che 'Vector',' MVector' e 'U.Unbox' non sono classi derivabili. Per non dire che non capisco cosa sta succedendo lì, specialmente con la cosa 'GeneralizedNewtypeDeriving', e mi piacerebbe capire le cose prima di usarle. – Drew

+0

Non che risponda alla tua domanda, ma hai provato a lavorare con i vettori in scatola qui? Gestiranno il tuo tipo di dati senza problemi. – jtobin

risposta

0

GeneralizedNewtypeDeriving non ti aiuterà qui perché hai a che fare con un ADT "full-blown", piuttosto che un nuovo tipo che include qualcosa che è già un'istanza di Unbox.

Il tipo di dati è più adatto ai vettori in scatola. Utilizzare Data.Vector.Unboxed se è necessario contenere più tipi di dati primitivi come Double s, Int s, ecc. Forse è possibile creare Color un'istanza di Unbox, ma quasi certamente non vale lo the hassle. Importa Data.Vector e ti verrà impostato:

import qualified Data.Vector as V 

Color = Red | Blue deriving Show 

someColors :: V.Vector Color 
someColors = V.fromList [Red, Blue, Blue, Red] 
+0

Come ho menzionato in un precedente commento, il recupero dei dati dal mio normale vettore in scatola occupava il 12% del tempo nel mio programma. Vorrei eliminare un po 'di ciò passando a unboxed. – Drew

8

È possibile utilizzare il pacchetto vector-th-unbox per derivare l'istanza per voi. Hai solo bisogno di fornire funzioni di conversione da e verso un certo tipo esistente Unbox:

colorToWord8 :: Color -> Word8 
colorToWord8 = ... 

word8ToColor :: Word8 -> Color 
word8ToColor = ... 

derivingUnbox "Color" 
    [t| Color -> Word8 |] 
    colorToWord8 
    word8ToColor 
Problemi correlati