我很难找到适用于如何使我的数据类型未装箱、用于未装箱向量的良好资源。我将如何制作数据类型
data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq)
是拆箱的一个实例?
编辑:经过一番探索之后,似乎通过强制某些函数中的参数严格,我可以说服 GHC 自动将它们拆箱。如果这适用于我的情况?我怎么知道哪些参数要严格?
我很难找到适用于如何使我的数据类型未装箱、用于未装箱向量的良好资源。我将如何制作数据类型
data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq)
是拆箱的一个实例?
编辑:经过一番探索之后,似乎通过强制某些函数中的参数严格,我可以说服 GHC 自动将它们拆箱。如果这适用于我的情况?我怎么知道哪些参数要严格?
您可以使用vector-th-unbox包为您派生实例。您只需要提供与某些现有Unbox
类型之间的转换功能:
colorToWord8 :: Color -> Word8
colorToWord8 = ...
word8ToColor :: Word8 -> Color
word8ToColor = ...
derivingUnbox "Color"
[t| Color -> Word8 |]
colorToWord8
word8ToColor
GeneralizedNewtypeDeriving
在这里对您没有帮助,因为您正在处理“成熟”的 ADT,而不是包装已经是Unbox
.
您的数据类型更适合盒装向量。如果Data.Vector.Unboxed
您需要保存更原始的数字类型,如Double
s、Int
s 等,请使用。也许您可以创建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]