haskellhigher-kinded-typeshigher-order-typesrank-n-types

Mapping over constrained existentially qualified higher order type


I hope I got the terminology right.

I want to do the following:

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)

Unfortunately, GHC seemingly can't infere the constraints right and complains with:

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

Is this somehow possible?


Solution

  • Changing the function type to something like this might do the trick:

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

    Also avoid using '$' as it kills polymorphism.