我看到的功能依赖性示例归结为映射container -> element
和arguments -> result
(如Mult Matrix Vector Vector
中所示)。它们似乎用类型函数表达得更好。在数据库理论中,更复杂的关系被认为不是这种形式(如a -> b, b -> a
)。
在Haskell中是否存在使用类型函数无法很好地编写FD的示例?
答案 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。