数据位中的Haskell逐位运算符
我是Haskell的新手,正在尝试使用Data.Bits中的逐位操作。每次我尝试时都会收到一条错误消息数据位中的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
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,错误似乎已经修复