私はファンデップを持つ型クラスを持っています:
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
class C a b | a -> b
特定のインスタンスを提供したい:
instance C A B
一般的なデフォルトのインスタンスと同様に:
instance C a D
このコードを記述どおりに実装すると、コンパイルされません。
Functional dependencies conflict between instance declarations:
instance C A B
instance C a D
型ファミリへの切り替えは役に立ちません:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
class C a where
type C' a
instance C A where
type C' A = B
instance C a where
type C' a = D
Conflicting family instance declarations:
C' A = B
C' a = D
理想的には、GHC に OverlappingInstances の「最も具体的な」ルールを使用してこれを解決してもらいたいと考えています。
これはしばらく前から知られている問題であり、さまざまなハッキーな解決策が提案されていることを理解しています。
- [Haskell-cafe] 関数の依存関係を持つインスタンスの重複 (2005 年 7 月[!])
- https://homepages.cwi.nl/~ralf/HList/
- 関数の依存関係に対する健全で決定可能な型推論
- 重複するインスタンス + 機能依存関係が不健全ですか?
- Haskellは重複するインスタンスをどのように解決しますか?
現在のGHC Haskellで最も推奨されるソリューションは何ですか?