Let's say I have a type class with n type parameters and I want any of them to uniquely determine all the other ones. Is it enough to make the dependencies form a cycle like in
class Foo a b c | a -> b, b -> c, c -> a
(linear) where there is a path from every parameter to every other one, or do I need to expand all possible paths like in
class Bar a b c | a -> b, a -> c, b -> a, b -> c, c -> a, c -> b
(quadratic)? Is there any observable difference between the two? And how about
class Baz a b c | a -> b c, b -> a c, c -> a b