基于约束的存在性合格高阶类型的映射

时间:2017-03-08 11:54:07

标签: haskell higher-kinded-types higher-order-types rank-n-types

我希望我的术语合适。

我想做以下事情:

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似乎无法推断出正确的约束并抱怨:

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

这有可能吗?

1 个答案:

答案 0 :(得分:1)

将函数类型更改为类似的东西可能会起到作用:

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

同时避免使用' $'因为它杀死了多态性。