6

我很难找到适用于如何使我的数据类型未装箱、用于未装箱向量的良好资源。我将如何制作数据类型

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

是拆箱的一个实例?

编辑:经过一番探索之后,似乎通过强制某些函数中的参数严格,我可以说服 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在这里对您没有帮助,因为您正在处理“成熟”的 ADT,而不是包装已经是Unbox.

您的数据类型更适合盒装向量。如果Data.Vector.Unboxed您需要保存更原始的数字类型,如Doubles、Ints 等,请使用。也许您可以创建Color的实例Unbox,但几乎可以肯定不值得麻烦。导入Data.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 回答