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) 

也避免使用「$」,因爲它殺死多態性。