6

我见过的函数依赖的例子归结为映射container -> element,和arguments -> result(如Mult Matrix Vector Vector)。它们似乎用类型函数更好地表达。在数据库理论中,更复杂的关系被认为不是这种形式(如a -> b, b -> a)。

Haskell 中是否有使用类型函数不能很好地编写的 FD 使用示例?

4

2 回答 2

4

正如 Manuel Chakravarty解释的那样,类型函数和函数依赖关系具有大致相同的表现力,您可以将一种表述转化为另一种表述。当您查看与其他语言扩展(如 GADT 或 UndecidableInstances)的交互时,它们才开始有所不同。我收集到目前倾向于在 GHC 中实现类型族,因为它们与 GADT 和存在类型的交互要简单得多。

于 2010-07-31T16:12:17.150 回答
3

正如 Heinrich Apfelmus 已经说过的那样,单独的 MPTC+FunDeps 和 TF 是等效的。当它们与其他扩展特别是重叠实例结合时,就会出现差异。当允许重叠而 FunDeps 允许重叠时,TF 是不健全的。例如,使用 FunDeps 很容易实现类型相等:

data HTrue
data HFalse

class  TypeEq a b eq | a b -> eq
instance                TypeEq a a HTrue
instance eq ~ HFalse => TypeEq a b eq

这里的关键点是重叠的。原则上可以在不重叠的情况下实现类型相等,但需要编译器支持。Oleg 在这里描述了这种方法:http: //okmij.org/ftp/Haskell/typeEQ.html

PS关于这个主题的haskell-prime邮件列表进行了长时间的讨论。

于 2012-01-20T14:52:42.393 回答