假设我有一个带有 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
答案 0 :(得分:1)
在操作上,以上所有内容都是等效的:
首先,a -> b c
与a -> b, a -> c
完全相同。
接下来,假设我们得到Foo a b c => (a, b, c)
。说,我们意识到a ~ A
。我们找到a -> b
fundep并浏览实例以查找b ~ B
。我们再次找到b -> c
fundep并实现c ~ C
。我们得到了(A, B, C)
。
如果我们Bar a b c => (a, b, c)
使用a ~ A
,我们会找到a -> b
和b ~ B
,但在找到b -> c
之前,我们会找到a -> c
。
唯一的区别是哪些fundep箭头用于推断类型。 a -> b, b -> c
和a -> b, a -> c
无法产生不同的结果。