2

我想使用一个 32 位的位域来按顺序存储最后 32 次计算的结果。例如 0110 ... 将失败 pass pass fail ... 。理想情况下,最新的结果应该只是被推到位域上,而最旧的结果在另一边“消失”。例如: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 *等等。我认为这是我在这里缺少的一些非常基本的东西。如何创建位域?

4

1 回答 1

4

只需使用Word32fromData.Word作为位图。它是一种具有Bits实例的类型,因此您可以在其上使用 typeclassBits的方法:

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)
于 2013-07-18T13:08:26.447 回答