gpt4 book ai didi

haskell - 将枚举类型存储在未装箱的向量中

转载 作者:行者123 更新时间:2023-12-03 14:51:27 27 4
gpt4 key购买 nike

假设我有这样的事情:

data Colour = Red | Blue | Green
deriving (Eq, Ord, Enum, Bounded, Read, Show)

我想要一个未装箱的 VectorColour s。我显然不能直接这样做(因为 Colour 不是 Unbox 的实例),但我也不知道我将如何编写 Unbox Colour 的实例. Unbox 的文档似乎没有说明您如何将某些东西作为它的实例(或者至少,不是以我理解的方式)。

最佳答案

一种方法是使用 Data.Vector.Unboxed.Deriving ,它使用模板 Haskell 根据现有类型为新类型定义正确的实例,Unbox实例。

{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, TemplateHaskell #-}
module Enum where


import qualified Data.Vector.Unboxed as U
import Data.Vector.Generic.Base
import Data.Vector.Generic.Mutable
import Data.Vector.Unboxed.Deriving
import Data.Word



data Colour = Red | Blue | Green
deriving (Eq, Ord, Enum, Bounded, Read, Show)

colourToWord8 :: Colour -> Word8
colourToWord8 c =
case c of
Red -> 0
Blue -> 1
Green -> 2

word8ToColour :: Word8 -> Colour
word8ToColour w =
case w of
0 -> Red
1 -> Blue
_ -> Green


derivingUnbox "Colour"
[t| Colour -> Word8 |]
[| colourToWord8 |]
[| word8ToColour |]


test n = U.generate n (word8ToColour . fromIntegral . (`mod` 3))

当然,在这种情况下这会浪费空间,因为我们只使用了 Word8 中 8 位中的 2 位。 .

关于haskell - 将枚举类型存储在未装箱的向量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38633218/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com