使用Data.Bits创建位域

时间:2013-07-18 11:25:33

标签: haskell

我想使用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?

1 个答案:

答案 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)