良い答え:いいえ、あなたが望んでいることは実際には実行可能ではありません。希望どおりに動作するように見えるインスタンスを作成できます。プロセスでGHC拡張機能が必要になる可能性がありますが、希望どおりに機能しません。
賢明でない答え:恐ろしいタイプレベルのメタプログラミングを使用して、おそらくあなたが望むことを達成することができますが、それは複雑になる可能性があります。何らかの理由でこれを絶対に機能させる必要がない限り、これは実際には推奨されません。
公式には、インスタンスは他のインスタンスに実際に依存することはできません。GHCは決定を行うときに「インスタンスヘッド」のみを確認し、クラスの制約は「コンテキスト」にあるためです。ここで「型クラスの同義語」のようなものを作成するには、考えMonad
られるすべての型のインスタンスのように見えるものを記述する必要がありますが、これは明らかに意味がありません。Monad
独自の問題がある他のインスタンスと重複することになります。
それに加えて、そのようなインスタンスはインスタンス解決の終了チェック要件を満たさないと思います。そのため、UndecidableInstances
拡張機能も必要になります。これは、GHCのタイプチェッカーを無限ループに送るインスタンスを作成する機能を意味します。 。
本当にそのうさぎの穴を掘り下げたいのなら、オレグ・キセリョフのウェブサイトを少し見て回ってください。彼はHaskellのタイプレベルのメタプログラミングの守護聖人のようなものです。
確かに楽しいことですが、コードを書いてそれを機能させたいだけなら、おそらく苦労する価値はありません。
編集:さて、後から考えると、私はここで問題を誇張しました。のようなものは1回限りで正常に機能し、 -およびGHC拡張機能PhantomMonad
があれば、必要なことを実行できます。複雑なことは、問題の内容よりもはるかに複雑なことをしたいときに始まります。ノーマン・ラムゼーに電話してくれたことに心から感謝します。私は本当にもっとよく知っているべきでした。Overlapping
UndecidableInstances
私はまだ正当な理由なしにこの種のことをすることを本当にお勧めしません、しかしそれは私がそれを鳴らしたほど悪くはありません。Meaculpa。