我见过的函数依赖的例子归结为映射container -> element
,和arguments -> result
(如Mult Matrix Vector Vector
)。它们似乎用类型函数更好地表达。在数据库理论中,更复杂的关系被认为不是这种形式(如a -> b, b -> a
)。
Haskell 中是否有使用类型函数不能很好地编写的 FD 使用示例?
我见过的函数依赖的例子归结为映射container -> element
,和arguments -> result
(如Mult Matrix Vector Vector
)。它们似乎用类型函数更好地表达。在数据库理论中,更复杂的关系被认为不是这种形式(如a -> b, b -> a
)。
Haskell 中是否有使用类型函数不能很好地编写的 FD 使用示例?
正如 Manuel Chakravarty解释的那样,类型函数和函数依赖关系具有大致相同的表现力,您可以将一种表述转化为另一种表述。当您查看与其他语言扩展(如 GADT 或 UndecidableInstances)的交互时,它们才开始有所不同。我收集到目前倾向于在 GHC 中实现类型族,因为它们与 GADT 和存在类型的交互要简单得多。
正如 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邮件列表进行了长时间的讨论。