Почему это приводит к конфликту?
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
?