【问题标题】:How do I create an unbox instance of an ADT?如何创建 ADT 的拆箱实例?
【发布时间】:2012-11-28 07:35:35
【问题描述】:

我很难找到好的资源,这些资源可用于如何使我的数据类型未装箱,以便在未装箱的向量中使用。我将如何制作数据类型

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

是 Unbox 的一个实例吗?

编辑:经过一番探索,似乎通过强制某些函数中的参数严格,我可以说服 GHC 自动将它们拆箱。如果这适用于我的情况?我怎么知道哪些参数要严格?

【问题讨论】:

  • 你看过this answer吗?
  • 是的,GHCi 告诉我 VectorMVectorU.Unbox 不是可派生类。更不用说我真的不明白那里发生了什么,尤其是GeneralizedNewtypeDeriving的事情,我想在使用它们之前了解它们。
  • 不是说它回答了你的问题,而是你尝试过在这里使用盒装向量吗?他们会毫不费力地处理您的数据类型。
  • 当然。在我的程序中,从向量中提取值仍然占用了大约 12% 的时间,拆箱向量似乎是减少这种情况的方法。
  • 一个简单的解决方法是使用包装成新类型(如newtype Color = Color Int)的整数,而不是枚举数据类型。然后添加用于构造/解构实例的辅助函数。这不是很好,但如果性能很重要,它可能会有所帮助。见Performance-Data types-Enumerations

标签: haskell unboxing algebraic-data-types


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    GeneralizedNewtypeDeriving 在这里对您没有帮助,因为您正在处理“成熟”的 ADT,而不是包装已经是 Unbox 实例的新类型。

    您的数据类型更适合盒装向量。使用Data.Vector.Unboxed 如果您需要保存更多原始数字类型,例如Doubles、Ints 等。也许您可以将Color 设为Unbox 的实例,但几乎可以肯定它不值得@987654321 @。导入Data.Vector 即可设置:

    import qualified Data.Vector as V
    
    Color = Red | Blue deriving Show
    
    someColors :: V.Vector Color
    someColors = V.fromList [Red, Blue, Blue, Red]
    

    【讨论】:

    • 正如我在之前的评论中提到的,从我的常规盒装向量中获取数据占用了我程序 12% 的时间。我想通过切换到未装箱来消除其中的一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多