我无法找到适合如何使我的数据类型取消装箱的好资源,以便在未装箱的矢量中使用。我如何制作数据类型
data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq)
是Unbox的一个实例吗?
编辑:经过更多的探索后,似乎通过强制某些功能中的参数严格,我可以说服GHC自动拆箱。如果这适用于我的情况?我怎么知道哪个参赛者严格要求?
答案 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.Unboxed
,Double
等,请使用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]