具有功能依赖性的“实例中的非法类型同义词系列应用程序”

时间:2017-07-27 21:02:17

标签: haskell functional-dependencies type-families

我有一个带有功能依赖的多参数类型类:

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中的疏忽/缺失功能吗?

0 个答案:

没有答案