Haskell:功能依赖的非显而易见的例子

时间:2010-07-31 14:06:42

标签: haskell functional-dependencies

我看到的功能依赖性示例归结为映射container -> elementarguments -> result(如Mult Matrix Vector Vector中所示)。它们似乎用类型函数表达得更好。在数据库理论中,更复杂的关系被认为不是这种形式(如a -> b, b -> a)。

在Haskell中是否存在使用类型函数无法很好地编写FD的示例?

2 个答案:

答案 0 :(得分:4)

作为Manuel Chakravarty explains,类型函数和函数依赖具有大致相同的表达性,您可以将一个公式转换为另一个公式。当您查看与其他语言扩展(如GADT或UndecidableInstances)的交互时,它们才会开始出现差异。我认为类型家族目前有利于在GHC中实施,因为它们与GADT和存在类型的相互作用要简单得多。

答案 1 :(得分: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

P.S。关于此主题的haskell-prime邮件列表上有lengthy discussion