3

私はファンデップを持つ型クラスを持っています:

{-# 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 の「最も具体的な」ルールを使用してこれを解決してもらいたいと考えています。

これはしばらく前から知られている問題であり、さまざまなハッキーな解決策が提案されていることを理解しています。

現在のGHC Haskellで最も推奨されるソリューションは何ですか?

4

1 に答える 1