如何创建ADT的unbox实例?

Dre*_*rew 6 unboxing haskell algebraic-data-types

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

data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

是Unbox的一个实例?

编辑:经过更多的探讨后,似乎通过强制某些函数中的参数是严格的,我可以说服GHC自动取消装箱.如果这适用于我的情况?我怎么知道哪些参数要严格?

ham*_*mar 9

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

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

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

derivingUnbox "Color"
  [t| Color -> Word8 |]
  colorToWord8
  word8ToColor
Run Code Online (Sandbox Code Playgroud)


jto*_*bin 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]
Run Code Online (Sandbox Code Playgroud)