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