タプルに基づいて再帰的インスタンス型を作成したいと思います。私が探しているものは、これと似たものです:Haskell再帰型クラス
class Provider a b where
getInstance :: a -> b
instance Provider a b => Provider (x, a) b where
getInstance (x, a) = getInstance a
instance Provider (b, x) b where
getInstance (b, _) = b
tryFunc1 :: Int
tryFunc1 =
let provider = ("test", (10,())) :: (String, (Int,()))
in getInstance provider
tryFunc2 :: String
tryFunc2 =
let provider = ("test", (10,())) :: (String, (Int,()))
in getInstance provider
不幸にも、haskellはインスタンスを解決できません。何らかの理由?
可能であれば、2番目のインスタンスよりも最初のインスタンスを使用することをお勧めします。残念ながら、複数の候補がある場合にどのインスタンスを使用するかを決定しようとすると、GHCは最も具体的なものを特定しようとするためにインスタンスヘッドを調べます。 – Alec
しかし、私が書いたケースでは、tryFunc2では2番目のインスタンスが2番目の型引数としてStringを持つ唯一のものであり、tryFunc1の場合は最初のものと2番目のものの組み合わせ。可能なソリューションは1つのみです。 –
@FernandoRinconハスケルのtypeclassシステムの設計は、(バックトラック)検索をせずに解決策を見つけることができるというユニークな解決策以上のものを保証します。これは効率性と表現力とのトレードオフであり、私の意見では言語にうまく対応しています。一般に、提案されたインスタンスは、たとえそれが一意であっても解決策を見つけるためにコンパイラに検索を要求し、拒否されます。 –