所有类型参数在功能依赖性中相互依赖

时间:2015-09-04 08:48:28

标签: haskell typeclass functional-dependencies

假设我有一个带有 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

1 个答案:

答案 0 :(得分:1)

在操作上,以上所有内容都是等效的:

首先,a -> b ca -> 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 -> bb ~ B,但在找到b -> c之前,我们会找到a -> c

唯一的区别是哪些fundep箭头用于推断类型。 a -> b, b -> ca -> b, a -> c无法产生不同的结果。