でループから相互に再帰的なデフォルトメソッドの防止、私は現在、次のような構造持っている:ランタイム
class F a where
f :: ...
default f :: (G a...) => ...
f = (some definition in terms of g)
class F a => G a where
g :: ...
default g :: (C a...) => ...
g = (some definition in terms of f)
うまくいけば、やや平易な英語では、私はいつもg
の面でf
を書くことができます。 という言葉でg
と書くことがあります。私はここを参照してください
問題は、誰かが書き込んだ場合で、用C T
instance F T
instance G T
を満たすタイプT
これは、実行時にコンパイルしてループしますと言います。両方のデフォルト定義が正しいのに対し、少なくとも1つは定義されていることが重要です。
f
とg
が同じクラスにあった場合、これはMINIMAL
プラグマで解決できますが、この場合はそうではありません。
また同じクラスにf
とg
の両方を配置するg
のすべての定義のためf
の定義がある一方で、f
のすべての定義のためg
の定義がないよう、可能ではないようです。 1つの可能性はg
をF
に移動することですが、C a
という制約も入れていますが、C a
を満たしていないa
のデフォルト以外の定義でg
を定義することができなくなります。
私が直面しているこのジレンマを解決するためにこれを再構成する方法はありますか?
別のフォールバックオプションはG'および/または '' F'のデフォルトの定義を持っているが、その代わりに、インスタンス・ライターがへ*明示的に*オプトインに使用することができ、スタンドアロン機能を提供しないだろう"デフォルト"の実装( 'g = defaultG'を書くことによって)。うまくいけば少なくとも少なくとも1つは意図的な選択だったので、*間違いなく*両方をデフォルトとして残すのが少し難しいことを望みます。 – Ben