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

Ale*_*ing 9 haskell type-families functional-dependencies

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

class Multi a b | a -> b
Run Code Online (Sandbox Code Playgroud)

我还有一个简单的非内射型同义词家族:

type family Fam a
Run Code Online (Sandbox Code Playgroud)

我想编写一个在第二个参数Multi中使用的实例Fam,如下所示:

instance Multi (Maybe a) (Fam a)
Run Code Online (Sandbox Code Playgroud)

但是,不接受此实例。GHC抱怨以下错误消息:

error:
  • Illegal type synonym family application in instance: Fam a
  • In the instance declaration for ‘Multi (Maybe a) (Fam a)’
Run Code Online (Sandbox Code Playgroud)

幸运的是,有一种解决方法。我可以执行通常的技巧,将类型移出实例头并移入相等约束:

instance (b ~ Fam a) => Multi (Maybe a) b
Run Code Online (Sandbox Code Playgroud)

该实例被接受!但是,我开始思考,开始怀疑为什么这种转换不能应用于的所有实例Multi。毕竟,功能上的依赖关系是否意味着b每个函数只能有一个a?在这种情况下,GHC似乎没有理由拒绝我的初审。

我发现了GHC Trac故障单#3485,它描述了类似的情况,但是该类型类不涉及功能依赖性,因此(正确地)将故障单视为无效关闭。但是,在我的情况下,我认为功能依赖性避免了故障单中描述的问题。我有什么要忽略的吗?或者这真的是GHC中的疏忽大意吗?

小智 -1

根据评论,我认为问题是为什么第一个实例 Multi (Maybe a) (Fam a) 不起作用,如果第二个实例是由于内存分配,为什么当您实现此解决方案时它会起作用

instance (b ~ Fam a) => Multi (Maybe a) b因为在这个中你将把 (b ~ Fam a) 移动到 Multi (也许 a),其中 b 仍然作为储备

但这就是我的想法