如何创建ADT的unbox实例?

时间:2012-11-28 07:35:35

标签: haskell unboxing algebraic-data-types

我无法找到适合如何使我的数据类型取消装箱的好资源,以便在未装箱的矢量中使用。我如何制作数据类型

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

是Unbox的一个实例吗?

编辑:经过更多的探索后,似乎通过强制某些功能中的参数严格,我可以说服GHC自动拆箱。如果这适用于我的情况?我怎么知道哪个参赛者严格要求?

2 个答案:

答案 0 :(得分:9)

您可以使用vector-th-unbox包为您派生实例。您只需要在现有的Unbox类型中提供转换函数:

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

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

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

答案 1 :(得分:0)

GeneralizedNewtypeDeriving在这里不会帮助你,因为你正在处理一个“完整的”ADT,而不是包含已经是Unbox实例的新类型。

您的数据类型更适合于盒装向量。如果您需要保留更多原始数字类型,例如Data.Vector.UnboxedDouble等,请使用Int。也许您可以将Color设为Unbox的实例,但它几乎肯定不值得the hassle。导入Data.Vector,您将被设置:

import qualified Data.Vector as V

Color = Red | Blue deriving Show

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