2012-11-28 5 views
5

ボックス化されていないベクターで使用するために、自分のデータ型をボックス化しないようにするための良いリソースを見つけるのが難しいです。ADTのunboxインスタンスを作成するにはどうすればよいですか?

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

をUnboxのインスタンスにするにはどうすればよいですか。

編集:もう少し詳しく調べてみると、いくつかの関数でパラメタを強制的に厳密にすることで、GHCが自動的にunboxするように説得することができます。これが私の場合に当てはまるのですか?どのパラマタが厳格にするのかをどのように知るのですか?

+0

あなたは[この回答](http://stackoverflow.com/a/10866718)で見たことがありますか? – Fixnum

+0

はい、GHCiは 'Vector'、' MVector'、 'U.Unbox'は派生クラスではないと言いました。特にGeneralizedNewtypeDerivingを使って何が起こっているのか分かりませんが、使用する前に理解したいと思います。 – Drew

+0

あなたの質問に答えてくれるわけではありませんが、ここで箱入りのベクトルを使って作業しましたか?彼らは面倒なくあなたのデータ型を処理します。 – jtobin

答えて

0

GeneralizedNewtypeDerivingは、既にUnboxのインスタンスである新しいタイプをラップするのではなく、本格的なADTを扱っているため、ここでお手伝いしません。

あなたのデータ型は、ボックス化されたベクターに適しています。 Doubles、Intsなどのプリミティブな数値型を保持する必要がある場合は、Data.Vector.Unboxedを使用します。ColorUnboxのインスタンスにすることはできますが、ほとんど確実にthe hassleという価値はありません。インポートData.Vectorあなたが設定されます:あなたはあなたのためのインスタンスを導出するvector-th-unboxパッケージを使用することができます

import qualified Data.Vector as V 

Color = Red | Blue deriving Show 

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

私が以前のコメントで述べたように、通常のボックス化されたベクトルからデータを取得することは、私のプログラムで時間の12%を占めていました。私はunboxedに切り替えることでそのいくつかを排除したいと思います。 – Drew

8

。あなただけのいくつかの既存のUnbox型にしてからの変換機能を提供する必要があります。

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

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

derivingUnbox "Color" 
    [t| Color -> Word8 |] 
    colorToWord8 
    word8ToColor 
関連する問題