web-dev-qa-db-ja.com

GHCに型付き穴の型クラス制約を提供させる方法はありますか?

現在の動作

Prelude> show _

<interactive>:7:6:
    Found hole ‘_’ with type: a0
    Where: ‘a0’ is an ambiguous type variable
    Relevant bindings include it :: String (bound at <interactive>:7:1)
    In the first argument of ‘show’, namely ‘_’
    In the expression: show _
    In an equation for ‘it’: it = show _

望ましい行動

型付きの穴にShow型クラスの制約があることをGHCが教えてくれるといいですね。

その他

GHCバージョン7.8.1

102
Wizek

これは、@ DominiqueDevrieseの GHCチケット のおかげでGHC8.0で修正されました。

拡張タイプのデフォルト のため、これはGHCiではすぐにはわかりません。あなたの例では、

> show _

  <interactive>:7:6: error:
    • Found hole: _h :: ()
      Or perhaps ‘_h’ is mis-spelled, or not in scope
    • In the first argument of ‘show’, namely ‘_h’
      In the expression: show _h
      In an equation for ‘it’: it = show _h
    • Relevant bindings include
        it :: String (bound at <interactive>:7:1)

穴のタイプはデフォルトで()になっています。これは明らかに 望ましい動作 ですが、拡張デフォルトはホールに適用されるべきではないという議論があります(それらの一般的な使用法は、コンパイラに推測されたタイプを通知させることです)。

それでも、GHCを使用してコンパイルするか、GHCiで拡張デフォルトルールを無効にすると(:set -XNoExtendedDefaultRulesを介して)、改善の結果が表示されます。

<interactive>:3:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘show’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In the expression: show _
      In an equation for ‘it’: it = show _

<interactive>:3:6: error:
    • Found hole: _ :: a0
      Where: ‘a0’ is an ambiguous type variable
    • In the first argument of ‘show’, namely ‘_’
      In the expression: show _
      In an equation for ‘it’: it = show _
    • Relevant bindings include
        it :: String (bound at <interactive>:3:1)
2
crockeea

現在は不可能ですが、推測によりGHCに追加される可能性があります。

1
Vikas Anand