我有一个带有功能依赖的多参数类型类:
class Multi a b | a -> b
我也有一个简单的非内射型同义词系列:
type family Fam a
我想在第二个参数中编写一个使用Multi
的{{1}}实例,如下所示:
Fam
但是,不接受此实例。 GHC抱怨以下错误消息:
instance Multi (Maybe a) (Fam a)
幸运的是,有一种解决方法。我可以执行一个通常的技巧,将类型移出实例头并进入等式约束:
error:
• Illegal type synonym family application in instance: Fam a
• In the instance declaration for ‘Multi (Maybe a) (Fam a)’
此实例已被接受!但是,我开始思考,我开始想知道为什么这个转换无法应用于 instance (b ~ Fam a) => Multi (Maybe a) b
的所有实例。毕竟,功能依赖性是否意味着每Multi
只能有一个b
?在这种情况下,GHC似乎没有理由拒绝我的第一次。
我找到了GHC Trac ticket #3485,它描述了类似的情况,但是类型类没有涉及功能依赖,所以票证(正当地)被关闭为无效。但是,在我的情况下,我认为功能依赖性避免了故障单中描述的问题。有什么我忽视的,或者这是GHC中的疏忽/缺失功能吗?