なぜこれが競合を引き起こすのですか?
class Foo a b | b -> a where
foo :: a -> b -> Bool
instance Eq a => Foo a a where
foo = (==)
instance Eq a => Foo a (a -> a) where
foo x f = f x == x
機能依存を削除すると、コードがコンパイルされることに注意してください。
私は、機能依存性は、実際にはコンパイルされるときに、次のようなものだけを許可するべきではないという印象を受けました!
class Foo a b | b -> a where
foo :: a -> b -> Bool
instance Eq a => Foo a a where
foo = (==)
instance Eq a => Foo Bool a where
foo _ x = x == x
同じb
パラメーターですが、パラメーターが異なりa
ます。これは、 ?によって一意に決定されるb -> a
ことを意味するため、これを禁止するべきではありません。a
b