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 tNumのスーパークラスでBitsあるため、暗黙的に示されます。また、インタープリターによって表示されるためShow t)。

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

頭から離れて、デフォルトであいまいさの解決を妨げる言語拡張を考えることができないので、結論はあなたのghciが古いということです。このBitsクラスは、Haskell98レポートで定義されている標準ライブラリに含まれていなかったため、BitsGHC <7など、その標準に準拠しているコンパイラでデフォルト設定するのに制約はありませんでした。

その場合、当面の回避策は型シグネチャを指定することです。

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

問題の修正は、GHCを新しいHaskell2010標準に準拠したバージョンにアップグレードすることです。

于 2012-04-28T03:41:21.873 に答える