Отображение ограниченного экзистенциально квалифицированного типа более высокого порядка

Надеюсь, я правильно понял терминологию.

Я хочу сделать следующее:

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)

Это как-то возможно?


person Philip Kamenarsky    schedule 08.03.2017    source источник
comment
Попробуйте заменить '$' на обычную круглую скобку.   -  person Clinton    schedule 08.03.2017
comment
Это невозможно. Как следует из сообщения об ошибке, для функции f требуется ограничение (ToJSON (b b1)), которое не обеспечивается сопоставлением с образцом в (Hide a). Контекст в сообщении об ошибке дает фактически предоставленные ограничения. Не могли бы вы дать более подробную информацию о том, что вы пытаетесь сделать?   -  person Li-yao Xia    schedule 08.03.2017
comment
В конце концов я заставил его работать, удалив ограничение A.ToJSON (a b), спасибо!   -  person Philip Kamenarsky    schedule 08.03.2017


Ответы (1)


Изменение типа функции на что-то вроде этого может помочь:

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

Также избегайте использования '$', так как это убивает полиморфизм.

person Clinton    schedule 08.03.2017