Haskell 使用数据创建位字段。位

Haskell 使用数据创建位字段。位,haskell,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 amb

我想使用一个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
或类似的错误。有时,它要求的是那种……等等。。我想这是我在这里缺少的一些非常基本的东西。如何创建位字段?

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

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


我们能看到触发这个错误的代码吗?@Ingo我自己的代码太天真了。我在这里放置了一个基于LLVM代码的版本,该版本应该创建位字段,但它给出了相同的错误:尝试bitDefault 32::IntegerExpecting一个普通类型,但找到了一个种类约束类型,我想这都是因为我不知道如何初始化/创建一个位字段。然而,我在某个地方读到,位域只能用模板Haskell创建?我们能看到触发此错误的代码吗?@Ingo我自己的代码太天真了。我在这里放置了一个基于LLVM代码的版本,该版本应该创建位字段,但它给出了相同的错误:尝试bitDefault 32::IntegerExpecting一个普通类型,但找到了一个种类约束类型,我想这都是因为我不知道如何初始化/创建一个位字段。但是,我在某个地方读到,只能用模板Haskell创建位域?我想没有什么会妨碍我将位图创建为IORef?@JFritsch你是对的,但要考虑到IOREF只能在真正必要的时候使用-它们使Haskell只是一个笨重的C。试着用功能性的方式完成任务-我保证你会喜欢这一点:@JFritsch,对于函数式语言来说,你想将结果保存在位图中是不常见的,除非你想在文件/网络或与C/硬件的接口中编写,否则我会使用[Bool]来代替,不要害怕列表,它们是FP的基本要素。我想没有什么会阻碍我将位图作为IORef?@JFritsch你说得对,但要考虑到IOREF只能在真正必要的时候使用-它们使Haskell只是一个笨重的C。试着用功能性的方式完成任务-我保证你会喜欢这一点:@JFritsch,对于函数式语言来说,将结果保存在位图中的意图并不常见,除非您想在文件/网络或与C/硬件的接口中编写,否则我将使用[Bool],而不是使用列表,不要害怕列表,它们是FP的基本要素。
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)