関数従属性を使用して、Foo
クラスを宣言できます。
class Foo a b c | a -> b where
foo1 :: a -> b -> c
foo2 :: a -> c
私が電話するとfoo2
、すべてが正常に機能します。コンパイラは、依存関係があるため、使用するインスタンスを認識しています。
しかし、依存関係を削除して作成するとFoo'
:
class Foo' a b c where
foo1' :: a -> b -> c
foo2' :: a -> c
すべてが正常にコンパイルされますが、GHCを呼び出そうとすると、あいまいなfoo2'
ために使用するインスタンスを解決できないというエラーがスローされます。b
foo2'
エラーなしで電話をかけることは可能ですか?もしそうなら、どのように?そうでない場合、なぜコンパイルエラーが発生しないのですか?