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 仍然作为储备
但这就是我的想法