2012-11-28 27 views
5

Mam problemy ze znalezieniem dobrych zasobów, które pomagają w rozpakowywaniu moich typów danych, do użycia w unboxed vector. Jak ustawić typ danych jako instancji Unbox?Jak utworzyć instancję ODB skrzynki odbiorczej?

Edycja: po grzebieniu trochę więcej, wydaje się, że wymuszając na paramotorach niektóre funkcje, które są surowe, mogę przekonać GHC, by automatycznie je rozpakował. Jeśli ma to zastosowanie w moim przypadku? Skąd mam wiedzieć, które parametry muszą być surowe?

+0

Szukały na tej odpowiedzi [] (http://stackoverflow.com/a/10866718)? – Fixnum

+0

Tak, GHCi powiedział mi, że 'Vector',' MVector' i 'U.Unbox' nie są klasami możliwymi do uzyskania. Nie wspominając o tym, że tak naprawdę nie rozumiem, co się tam dzieje, szczególnie z rzeczą "GeneralizedNewtypeDeriving" i chciałbym zrozumieć rzeczy, zanim ich użyję. – Drew

+0

Nie to, że odpowiada na twoje pytanie, ale czy próbowałeś tutaj pracować z wektorami w pudełkach? Będą obsługiwać twój typ danych bez kłopotów. – jtobin

Odpowiedz

0

GeneralizedNewtypeDeriving nie pomoże ci tutaj, ponieważ masz do czynienia z pełnowymiarowym ADT, a nie z nowymi opakowaniami, które już są instancją Unbox.

Twój typ danych jest bardziej odpowiedni dla wektorów pudełkowych. Jeśli potrzebujesz więcej podstawowych typów liczbowych, takich jak Double s, Int itp., Możesz wykonaćinstancję z Unbox, ale prawie na pewno nie jest warta the hassle. Import Data.Vector i będziesz ustawiony:

import qualified Data.Vector as V 

Color = Red | Blue deriving Show 

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

Jak już wspomniałem w poprzednim komentarzu, pobieranie danych z mojego standardowego wektora pudełkowego zajmowało 12% czasu w moim programie. Chciałbym wyeliminować niektóre z tego, przechodząc do unboxed. – Drew

8

Można użyć pakietu vector-th-unbox czerpać instancję dla Ciebie. Wystarczy, aby zapewnić funkcje konwersji do iz jakiegoś istniejącego Unbox typu:

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

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

derivingUnbox "Color" 
    [t| Color -> Word8 |] 
    colorToWord8 
    word8ToColor 
Powiązane problemy