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)
在操作上,以上所有内容都是等效的:
首先,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)
with a ~ A
,我们就会发现a -> b
,并且b ~ B
,但是在发现之前b -> c
,我们就会发现a -> c
。
唯一的区别是使用哪些fundep 箭头来推断类型。a -> b, b -> c
并且a -> b, a -> c
不能产生不同的结果。