2012-04-28 146 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