SQLのようなクエリ最適化をモデル化する次の型クラスがあります。
class OptimizableQuery q where
type Optimized q :: *
optimize :: q -> Optimized q
instance Query q => OptimizableQuery q where
type Optimized q = q
optimize q = q
instance (Query q, OptimizableQuery q) => OptimizableQuery (Select (Select q p) p) where
type Optimized (Select (Select q p) p) = Select (Optimized q) p
optimize (Select (Select q _) p) = Select (optimize q) p
問題は、最適化された型関数で「競合するファミリインスタンス宣言」というエラーが発生することです。それはなぜですか、どうすれば解決できますか?すべてのケース(かなり多くなる可能性があります)を使い果たすのではなく、「フォールバックインスタンス」があると本当に便利です...