Гаркелл Функциональный конфликт зависимости

Почему этот результат в конфликте?

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 ?

13
задан Thomas Eding 15 September 2011 в 19:12
поделиться