1

我希望我的术语是正确的。在约束存在限定的高阶类型映射

我要做到以下几点:

data Hide a = ∀ b. (A.ToJSON (a b), A.ToJSON b) ⇒ Hide (a b) 

mapHide ∷ (∀ c. (A.ToJSON (b c), A.ToJSON c) ⇒ a c → b c) → Hide a → Hide b 
mapHide f (Hide a) = (Hide $ f a) 

不幸的是,GHC貌似不能infere约束权,并抱怨:

Could not deduce (A.ToJSON (b b1)) arising from a use of ‘Hide’ 
    from the context (A.ToJSON (a b1), A.ToJSON b1) 

这在某种程度上可能吗?

+0

尝试将'$'更改为普通圆括号。 – Clinton

+0

这是不可能的。如错误消息所示,函数'f'需要一个'(ToJSON(b b1))'约束,它不是由'(Hide a)'上的模式匹配提供的。错误消息中的“上下文”给出了实际提供的约束条件。 你能否提供更多关于你想要做什么的细节? –

+0

最终我通过删除'A.ToJSON(a b)'约束来实现它,谢谢! –

回答

1

更改功能类型来这样的事情可能做的伎俩:

(A.ToJSON (b c2), A.ToJSON c2) ⇒ 
(∀ c. (A.ToJSON (a c), A.ToJSON c) ⇒ a c) 
    → b c2) 

也避免使用“$”,因为它杀死多态性。