5

Haskell の対話型プロンプト (ghci) をいじっていると、気になるものに出くわしました。次のコードは ghci 7.0.4 で実行されます

[minBound..1]

次の例外をスローします。

<interactive>:1:12:
    Ambiguous type variable `t0' in the constraints:
      (Num t0) arising from the literal `1' at <interactive>:1:12
      (Enum t0) arising from the arithmetic sequence `minBound .. 1'
                at <interactive>:1:1-13
      (Bounded t0) arising from a use of `minBound'
                   at <interactive>:1:2-9
    Probable fix: add a type signature that fixes these type variable(s)
    In the expression: 1
    In the expression: [minBound .. 1]
    In an equation for `it': it = [minBound .. 1]

上記を [minBound..1 :: Int] と書くと、ここで '1' がIntであることを意味することが明確になることはわかっていますが、私の質問は、あいまいさはどこにあるのでしょうか? '1' はIntIntegerFloat、またはDoubleとして解釈できますが、Int以外のこれらはいずれもBoundedクラスに属しません。では、リテラル 1 がなりすますことができる別のクラスはありますか? そうでない場合は、何ですか?

4

1 に答える 1

10

デフォルトのルールに従って、制約された型変数は、デフォルトによって解決されようとします。

  • すべての制約の形式はC a;です。a制約内の型コンストラクターへの引数として表示されない、および
  • 関連するクラスの少なくとも1つは数値クラスであり、
  • すべてのクラスは、プレリュードまたは標準ライブラリで定義されています。

式の推定タイプは次のとおり[minBound .. 1]です。

[minBound .. 1] :: (Num a, Enum a, Bounded a) => [a]

したがって、デフォルトのルールが適用されます。ただし、デフォルトの場合、モジュールのデフォルト宣言にリストされている型のみが考慮されます。デフォルト宣言がない場合は、デフォルトのデフォルト(Integer, Double)が想定されます。つまり、制約付きのあいまいな型変数を解決するために、最初Integerに試行されます。 tはすべての制約を満たし、Double試行されます。それでもすべての制約が満たされない場合、デフォルト設定は失敗し、コンパイルはエラーで失敗しますambiguous type variable¹。

手元のケースでは、制約を満たしていIntegerないため、デフォルト設定は失敗します。DoubleBounded

¹ghciでは、またはExtendedDefaultRules拡張機能が有効になっている場合、制約に数値クラスが含まれていないShowが、含まれている場合はデフォルト設定も試行され、デフォルトのデフォルトは。によって拡張され()ます。

于 2012-04-23T20:23:32.240 に答える