6

ボックス化されていないベクターで使用するために、データ型をボックス化解除する方法に役立つ適切なリソースを見つけるのに苦労しています。データ型を作成するにはどうすればよいですか

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

Unbox のインスタンスになりますか?

編集:もう少し突っ込んだ後、一部の関数のパラメーターを厳密にすることで、GHCにそれらを自動的にボックス化解除するよう説得できるようです。これが私の場合に当てはまる場合は?どのパラメーターを厳密にするかを知るにはどうすればよいですか?

4

2 に答える 2

9

vector-th-unboxパッケージを使用して、インスタンスを派生させることができます。Unbox既存の型との間の変換関数を提供する必要があるだけです。

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

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

derivingUnbox "Color"
  [t| Color -> Word8 |]
  colorToWord8
  word8ToColor
于 2012-11-28T12:28:34.887 に答える
0

GeneralizedNewtypeDeriving既に のインスタンスである何かをラップする newtype ではなく、「本格的な」ADT を扱っているため、ここでは役に立ちませんUnbox

データ型は、ボックス化されたベクトルに適しています。s 、 s などのData.Vector.Unboxedより基本的な数値型を保持する必要がある場合に使用します。おそらくのインスタンスを作成できますが、面倒な の価値がないことはほぼ確実です。インポートすると、次のように設定されます。DoubleIntColorUnboxData.Vector

import qualified Data.Vector as V

Color = Red | Blue deriving Show

someColors :: V.Vector Color
someColors = V.fromList [Red, Blue, Blue, Red]
于 2012-11-28T08:37:13.610 に答える