2012-04-28 38 views
1

私はHaskellを初めて使用しており、Data.Bitsからビット単位演算を使用しようとしています。 。|私がしようとするたびに私は、エラーメッセージData.BitsのHaskellビット演算子

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、version 7.0.4'はうまく動作します。- 出力 65536' – Pikaurd

答えて

7

を見つけることができれば、Haskellはその後、1と16種類のソリューションを推測することはできません、提供することですヒント:

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

'shiftL ::ビットa => a - > Int - > a'のように16の型を推論できます。 1だけがあいまいです。 –

+0

ありがとう、それは完璧に働いた!私は、関数を宣言して明示的にすべての型を指定すると、 – pu239ppy

3

ghciはどのタイプを選択するかわかりません。しかし、それはそうであるべきではない:式から

Prelude Data.Bits> 1 `shiftL` 16 
65536 

プロンプトで入力、制約Bits tNum t(推測されるが、Numは、したがって暗黙、Bitsのスーパークラスであり、それがあることがあるので通訳者によって表示され、またShow t)。

制約の1つが数値クラスであり、すべてのクラスがPreludeライブラリまたは標準ライブラリで定義されているため、あいまい型変数tdefaultingに適格です。明示的なデフォルト宣言がない場合、型としてIntegerを選択することであいまいさは解消されます。

私の頭の上では、デフォルト設定であいまいさの解決を妨げる言語拡張を考えることはできません。その結論は、ghciが古いことです。 BitsクラスはHaskell98レポートで定義された標準ライブラリではなかったのでBits制約は例えば、GHCその場合7.

<その規格に準拠しているコンパイラで不履行の対象ではありませんでした、即時の回避策があります、

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

を型シグネチャを指定して、あなたの問題への修正は、新しいHaskell2010規格に準拠しているバージョンにGHCをアップグレードすることです。

+0

が標準準拠ではなく、ghcの重大なバグである可能性もあることを発見しました。数値リテラルから生じるNum制約があります。それはghciの[拡張デフォルト設定](http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#extended-default- rules)の対象となるはずですが、 'Bits'制約は 'Num'制約を呑み込むため、デフォルトにはなりません。しかし、新しいGHCのように問題がないようです。 –

+0

私は最新のものを作り、何が起こるか見ることを試みます。 – pu239ppy

+0

ソースからGHCとGHCIをビルドしただけで、バグが修正されたように見えます – pu239ppy