2

我是 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)

这发生在许多操作中,我也尝试过。|。和 。&。

我一定遗漏了一些非常简单的东西,如果你能发现问题,请告诉我

4

2 回答 2

9

在交互式会话中,Haskell 无法推断出 1 和 16 的类型。那么解决方案就是给出提示:

> :m +Data.Bits
> let a = 1 :: Int
> let b = 16 :: Int
> a `shiftL` b
65535
>
于 2012-04-28T03:34:09.660 回答
3

ghci 不知道选择什么类型。但是,不应该这样:

Prelude Data.Bits> 1 `shiftL` 16
65536

根据在提示符处输入的表达式,Bits t可以推断出约束(也是Num t, 但是Num是 的超类Bits,因此是隐含的;并且因为它要由解释器显示,所以也Show t)。

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

在我的脑海中,我想不出一个语言扩展可以通过默认阻止歧义的解决,所以结论是你的 ghci 是旧的。该类Bits不在 Haskell98 报告中定义的标准库中,因此Bits在遵守该标准的编译器中,约束不符合默认条件,例如 GHC < 7。

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

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

and the fix to your problem is to upgrade your GHC to a version adhering to the newer Haskell2010 standard.

于 2012-04-28T03:41:21.873 回答