我想使用32位的位域,按顺序存储最后32次计算的结果。例如。 0110 ...将失败传球失败......理想情况下,最新结果应该被推到位域上,而最老的结果会在另一侧“消失”。例如:0110其中1是最新结果应该变为1101。
我正在努力使用Data.Bits
,并且不知道如何初始化/创建位域。我得到的错误有点类似于
No instance for (Bits a0) arising from a use of `bitDefault'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Bits Int -- Defined in `Data.Bits'
instance Bits Integer -- Defined in `Data.Bits'
instance Bits GHC.Types.Word -- Defined in `Data.Bits'
一旦我添加了类型签名,GHC会告诉我回复
Illegal literal in type (use -XDataKinds to enable): 32
或类似的错误。有时它会请求Kind *
等。我认为这是我在这里缺少的一些非常基本的东西。如何创建BitField?
答案 0 :(得分:4)
只需使用Word32
中的Data.Word
作为位图即可。它是一个具有Bits
实例的类型,因此您可以在其上使用类型类Bits
的方法:
import Data.Bits
import Data.Word
type Bitmap32 = Word32
bitmap :: Word32
bitmap = 0 -- initialize with zeros
...
testBit bitmap 10 -- test 10th bit
...
pushNewBit :: Bool -> Bitmap32 -> Bitmap32
pushNewBit b bitmap = (bitmap `shiftL` 1) .|. (if b then 1 else 0)