Haskell中的功能依赖

aXq*_*Xqd 8 haskell types type-systems typeclass functional-dependencies

我真的不明白.为什么我们需要呢?我的意思是如果我使用相同的类型参数,我认为这意味着它们应该是相同的类型.

我听说它可以帮助编译器避免无限循环.有人可以告诉我一些更多细节吗?

最后,在Real World Haskell中我们应该遵循功能依赖的使用吗?

[后续问题]

class Extract container element where
  extract :: container -> element

instance Extract (a,b) a where
  extract (x,_) = x
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我对容器和元素都使用了相同的类型变量'a',我认为编译器因此可以推断这两种类型是相同的类型.

但是当我在GHCi中尝试这个代码时,我收到了以下反馈:

*Main> extract('x',3)
<interactive>:1:0:
    No instance for (Extract (Char, t) element)
      arising from a use of `extract' at <interactive>:1:0-13
    Possible fix:
      add an instance declaration for (Extract (Char, t) element)
    In the expression: extract ('x', 3)
    In the definition of `it': it = extract ('x', 3)
Run Code Online (Sandbox Code Playgroud)

当其中一个被指定为类型'Char'时,为什么另一个仍未解析类型'element'?

snk*_*kid 7

我认为这很好地解释了它.所以基本上如果你有一个FD关系 - > b所有它意味着类型类实例只有一个'b'和任何'a'所以Int Int但你也不能有Int Float.这就是他们所说的'b'是由'a'唯一确定的意思.这扩展到任意数量的类型参数.需要它的原因是1.类型推断2.有时你需要这样的约束.

FD的替代方案是类型系列扩展,但不是所有FD的情况.