数据位中的Haskell逐位运算符

数据位中的Haskell逐位运算符,haskell,bit-manipulation,Haskell,Bit Manipulation,我是Haskell的新手,正在尝试使用Data.Bits中的逐位操作。每次我尝试时都会收到一条错误消息 Prelude Data.Bits> 1 `shiftL` 16 <interactive>:1:0: Ambiguous type variable `t' in the constraint: `Bits t' arising from a use of `shiftL' at <interactive>:1:0-12 Proba

我是Haskell的新手,正在尝试使用Data.Bits中的逐位操作。每次我尝试时都会收到一条错误消息

Prelude Data.Bits> 1 `shiftL` 16

<interactive>:1:0:
    Ambiguous type variable `t' in the constraint:
      `Bits t' arising from a use of `shiftL' at <interactive>:1:0-12
    Probable fix: add a type signature that fixes these type variable(s)
Prelude Data.bit>1`shiftL`16
:1:0:
约束中不明确的类型变量“t”:
`在1:0-12使用'shiftL'时产生的位t'
可能修复:添加修复这些类型变量的类型签名
这种情况发生在许多操作中,我也尝试过。及


我肯定遗漏了一些非常简单的内容,请告诉我您是否能在互动会话中发现问题,Haskell无法推断1和16的类型。那么,解决办法就是给出一个提示:

> :m +Data.Bits
> let a = 1 :: Int
> let b = 16 :: Int
> a `shiftL` b
65535
>

ghci不知道该选择什么类型。然而,情况不应该如此:

Prelude Data.Bits> 1 `shiftL` 16
65536
从提示符处输入的表达式中,可以推断出约束
位t
(也可以是
Num t
,但是
Num
位的超类,因此是隐含的;由于它将由解释器显示,因此也是
Show t

现在,由于其中一个约束是数值类,并且所有的类都在Prelude或标准库中定义,因此不明确的类型变量
t
符合条件。在没有显式默认声明的情况下,通过选择
Integer
作为类型来解决歧义

在我脑子里,我想不出一种语言扩展可以通过默认设置来阻止歧义的解决,所以结论是您的ghci已经过时了。haskell 98报告定义的标准库中没有
Bits
类,因此
Bits
约束不适用于遵循该标准的编译器中的默认值,例如GHC<7

在这种情况下,直接的解决方法是指定一个类型签名

Prelude Data.Bits> 1 `shiftL` 16 :: Int
65536

解决您的问题的方法是将GHC升级到符合更新的Haskell 2010标准的版本。

您可以发布GHC版本吗<代码>GHCi,7.0.4版
工作正常
ghci>1`shiftL`16——输出65536
它可以推断16的类型,因为
shiftL::Bits a=>a->Int->a
。只有1是模棱两可的。谢谢,这非常有效!我还发现,如果我声明函数并明确指定所有有效的类型,我认为这很可能不是标准遵从性,而是ghc中的一个有争议的错误–数值文本产生了一个
Num
约束,这应该使其符合ghci的条件–但是
约束吞没了
Num
约束,因此它无法默认。不过,新的GHC似乎没有问题。我会尝试构建最新版本,看看会发生什么。刚从源代码构建了GHC和GHCI,错误似乎已经修复