固定します。代わりに、GHCはそれがFoo a => SomeClass a
インスタンスを使用して、そうしなければならない前提としていますは、このコードを検討型エラー
Foo.hs:16:17:
Could not deduce (Foo a) arising from a use of ‘bar’
from the context (SomeClass a)
bound by the type signature for foo :: SomeClass a => a -> Int
at Foo.hs:15:8-32
Possible fix:
add (Foo a) to the context of
the inferred type of x :: Int
or the type signature for foo :: SomeClass a => a -> Int
In the expression: bar t
In an equation for ‘x’: x = bar t
In the expression: let x = bar t in x
この修正する2つの方法があります。foo
で
- が私にライン
instance SomeClass Int
を追加はlet x = bar t in x
bar t
にを変更し、プログラム
ここでは何が起こっていますか?なぜこの問題が発生しているのですか?これらの修正はなぜ機能しますか?
この例は、私の実際の問題によって単純化されています。多言語変換のためのCubixフレームワーク(arxiv.org/pdf/1707.04600)での作業中にこの問題が発生しました。
私の実際の問題には、制約InjF f IdentL FunctionExpL
( "fは、関数呼び出しで関数を表すために識別子が使用される言語です"という関数)が含まれています。私は(オーバーラップ可能な)インスタンス(FunctionIdent :<: f) => InjF f IdentL FunctionExpL
を持っています。これは、型チェッカーが握っているので、私に偽のCould not deduce FunctionIdent :<: f
エラーを与えます。
特定のFoo
の範囲にインスタンスInjF Foo IdentL FunctionExpL
が存在する場合でも、このエラーは解決されます。したがって、解決策は完全なストーリーではないことが予測されるleftaroundaboutの答えです。
'{ - #OVERLAPPABLE# - }'と '{ - #LANGUAGE FlexibleContexts# - } 'は何にも影響しません。コンパイルの別の方法: 'x :: Int'を' let'バインディングに追加してください。 – Alec
恐らく、最も厄介なことは、モジュール内に_インスタンスがあるときにタイプチェックすることです... – leftaroundabout