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

Pet*_*lák 14 haskell typeclass functional-dependencies

假设我有一个带有n个类型参数的类型类,我希望它们中的任何一个能够唯一地确定所有其他参数.是否足以使依赖关系形成一个循环,就像在

class Foo a b c | a -> b, b -> c, c -> a
Run Code Online (Sandbox Code Playgroud)

(线性)其中有从每个参数到每个参数的路径,或者我是否需要扩展所有可能的路径,如

class Bar a b c | a -> b, a -> c, b -> a, b -> c, c -> a, c -> b
Run Code Online (Sandbox Code Playgroud)

(二次)?两者之间是否有任何可观察到的差异?那怎么样?

class Baz a b c | a -> b c, b -> a c, c -> a b
Run Code Online (Sandbox Code Playgroud)

mni*_*iip 1

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

首先,a -> b c从字面上看,与 完全一样a -> b, a -> c

接下来,假设我们得到了Foo a b c => (a, b, c). 说吧,我们意识到了a ~ A。我们找到a -> bFundep 并扫描实例以查找b ~ B。我们再次找到了b -> cfundep并意识到了c ~ C。瞧,我们得到了(A, B, C)

相反,如果我们有Bar a b c => (a, b, c)with a ~ A,我们就会发现a -> b,并且b ~ B,但是在发现之前b -> c,我们就会发现a -> c

唯一的区别是使用哪些fundep 箭头来推断类型。a -> b, b -> c并且a -> b, a -> c不能产生不同的结果。