Все параметры типа зависят друг от друга в функциональных зависимостях

Допустим, у меня есть класс типов с n параметрами типа, и я хочу, чтобы любой из них однозначно определял все остальные. Достаточно ли сделать так, чтобы зависимости образовывали цикл, как в

class Foo a b c | a -> b, b -> c, c -> a

(линейный), где есть путь от каждого параметра к любому другому, или мне нужно расширить все возможные пути, как в

class Bar a b c | a -> b, a -> c, b -> a, b -> c, c -> a, c -> b

(квадратичный)? Есть ли заметная разница между ними? А как насчет

class Baz a b c | a -> b c, b -> a c, c -> a b

person Petr    schedule 04.09.2015    source источник
comment
Понятия не имею, но очень надеюсь, что они эквивалентны. Я ожидал, что они будут.   -  person chi    schedule 04.09.2015
comment
Я также хотел бы узнать о a -> b c, b -> a c, c -> a b в отношении...   -  person András Kovács    schedule 04.09.2015
comment
@ AndrásKovács Хороший вопрос, я добавил это к вопросу.   -  person Petr    schedule 04.09.2015
comment
Я бы начал с прочтения исходной статьи фонда: web.cecs. pdx.edu/~mpj/pubs/fundeps-esop2000.pdf   -  person Cactus    schedule 04.09.2015


Ответы (1)


Оперативно все вышеперечисленное эквивалентно:

Прежде всего, a -> b c буквально то же самое, что и a -> b, a -> c.

Далее предположим, что мы получили Foo a b c => (a, b, c). Скажем, мы понимаем, что a ~ A. Мы находим фонд a -> b и сканируем инстансы, чтобы найти b ~ B. Снова находим b -> c фундэп и реализуем c ~ C. Вуаля, мы получили (A, B, C).

Если бы вместо этого у нас было Bar a b c => (a, b, c) с a ~ A, мы бы нашли a -> b и b ~ B, однако, прежде чем найти b -> c, мы бы нашли a -> c.

Единственная разница заключается в том, какие стрелки фундепа используются для определения типов. a -> b, b -> c и a -> b, a -> c не могут давать разные результаты.

person mniip    schedule 06.09.2015