2012-04-28 188 views
1

我是Haskell的新手,并试图使用从Data.Bits按位操作。每次我尝试,我得到一个错误信息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) 

发生这种情况的多项业务,我也尝试过。|。和。 &。

我必须失去了一些东西很简单,请让我知道你是否能发现问题

+1

你可以发布你的ghc版本吗? 'GHCi,版本7.0.4'工作正常。 'ghci> 1 \'shiftL \'16 - 输出 65536' – Pikaurd 2012-04-28 03:32:13

回答

7

在互动环节,哈斯克尔不能推断出类型1和16的解决方案的话,是给提示:

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

它*可以*推断16的类型,因为'shiftL :: Bits a => a - > Int - > a'。只有1不明确。 – 2012-04-28 09:01:37

+0

谢谢,完美的工作!我还发现,如果我声明了函数并明确指定了所有类型,那么也可以使用 – pu239ppy 2012-04-28 12:39:15

3

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

Prelude Data.Bits> 1 `shiftL` 16 
65536 

从在提示输入的表达式,约束Bits t推断(也Num t,但NumBits类的超类,所以隐含的;并且因为它是要由口译员显示,也是Show t)。

现在,由于其中一个约束是数字类,并且所有类都在Prelude或标准库中定义,所以模糊类型变量t有资格使用defaulting。在没有明确的默认声明的情况下,通过选择Integer作为类型来解决歧义。

除了我头顶之外,我想不出一种语言延伸,它会阻止通过违约解决歧义,所以得出的结论是,你的ghci是旧的。所述Bits类不在由Haskell98报告定义的标准库,所以一个Bits约束是不符合在编译器附着到标准违约,例如GHC < 7.

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

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

和修复你的问题是你的GHC升级到版本秉承新Haskell2010标准。

+0

我认为这只是可能的,这不是标准遵从性,而是ghc中可争论的错误 - 数字文字中存在一个“Num”约束,这应该使其符合ghci的[延期违约](http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#extended-default-rules) - 但是“Bits”约束会吞噬'Num'约束,所以它无法默认。但似乎像新的GHCs不存在这个问题。 – 2012-04-28 09:04:35

+0

我将尝试构建最新内容并查看会发生什么情况。 – pu239ppy 2012-04-28 20:42:34

+0

从源头刚刚构建的GHC和GHCI,该错误似乎已得到修复 – pu239ppy 2012-04-29 04:02:30