は、あなたがn
のために期待しているタイプがD (forall a. (Floating a) => a)
であることが表示されますが、それはきっぱりない推察されるタイプです。実際に、そのタイプの注釈をn
に追加しようとすると、GHCが大きな文句を言うことに気付くでしょう。そのようなタイプは、GHCに証拠のある多型をサポートすることを要求し、現時点ではそうではありません(それが何であるか、それがなぜ複雑であるかの詳細については、What is predicativity?を参照してください)。
n
に対して実際に推論されるタイプはD Double
です。これは実際にプレイ中の2つの結果、つまり恐ろしいmonomorphism restrictionとHaskellのタイプのデフォルトルールの結果です。単相性の制約のために、n
は、(それが構文的に関数ではなく、明示的な型の注釈を持たないため)単形型であると推論されなければならない。このため、1 :: forall a. (Floating a) => a
は多型であるため、D 1
はあいまいです。しかし、この場合、Haskellは数値型のデフォルトルールを持っています。ほとんどの場合、Haskellの多態数リテラルのためにあいまいさを解決する必要がありません。
に型名を明示的に追加してFloating
にするため、Haskellは浮動小数点型のデフォルトルールを適用し、デフォルトはDouble
になります。したがって、n
のタイプはD Double
と推測されます。
monomorphismの制限を無効にすると、n
のタイプは、少し面白いタイプforall a. Floating a => D a
になりますが、これは、必要に応じて存在する定量化されたタイプではなく、より単純に普遍化されたタイプです。
ハスケルは 'D(forall a(Floating a)=> a)'のような型をサポートしていません。これは実際には 'n'のように見えますが、これはimpredicative polymorphismが必要です。ここでは '1 'は実際に多形であるが、Haskellの型デフォルト規則のため、' D 1'は 'D Double'のままである(そうでなければ型があいまいであると考えられる)。 –