haskell - Haskell 中的函数依赖

标签 haskell types typeclass type-systems functional-dependencies

我真的无法理解。为什么我们需要它?我的意思是如果我使用相同的类型参数,我认为这意味着它们应该是相同的类型。

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

最后,在 Real World Haskell 中函数依赖的使用是否有我们应该遵循的“模式和实践”?

【追问】

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

instance Extract (a,b) a where
  extract (x,_) = x

在上面的代码中,我为容器和元素使用了相同的类型变量“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)

当其中一个被指定为“Char”类型时,为什么另一个仍然是未解析的“元素”类型?

最佳答案

我以为 explains它还算不错。所以基本上,如果你有一个 a -> b 的 FD 关系,这意味着对于类型类实例,只能有一个 'b' 和任何 'a' 所以 Int Int 但你也不能有 Int Float 。这就是他们所说的“b”是由“a”唯一确定的意思。这扩展到任意数量的类型参数。需要它的原因是 1. 类型推断 2. 有时您需要这样的约束。

FD 的替代方案是类型族扩展,但并非适用于所有 FD 情况。

关于haskell - Haskell 中的函数依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4278085/

相关文章:

data-structures - 无限数据结构有哪些引人注目的用例?

c# - 如何检查当前类型(类型的对象)是否需要接口(interface)(或父类型)

java - 婚姻状况的数据类型? ( java )

haskell - 在 Haskell 中,有没有办法以多种方式表示类型应该是类型类的实例?

haskell - Set 类型类在哪里?

parsing - F# 解析器组合器

Haskell cabal 安装 : missing C library iw

c# - 如何声明新类型

haskell - 使 Vector.Generic 成为 Functor(和其他类型类

haskell - Haskell 高阶函数中 `subtract` 的行为