Я не думаю, что вы можете сделать это, но я, безусловно, могу ошибаться.В вашем примере вы пропускаете дополнительное ограничение Show (f a)
для его завершения:
deriving instance (forall a. (Show a, Show (f a)) =>
Show (HKD f a)) => Show (Result f)
Но это будет означать, что экземпляр Show
для f a
не может зависеть от a
, чтоможет быть истинным для конкретных f
, но не для всех.
Edit
Но в то же время можно написать что-то подобное без TypeFamilies
:
data Bar f = MkBar (f Int)
deriving instance (forall a . Show a => Show (f a)) => Show (Bar f)
Итак, я не уверен, почему GHC не может понять это.
Edit 2
Вот интересныйнаблюдение, это компилирует:
type family HKD f a where
-- HKD Identity a = a
HKD f Int = Int
HKD f a = f a
data Result f = MkResult
{ foo :: HKD f Int
, bar :: HKD f Bool
}
deriving instance (forall a. Show a => Show (f a)) => Show (Result f)
и работает как ожидалось:
λ> show $ MkResult 5 (Just True)
"MkResult {foo = 5, bar = Just True}"
Итак, похоже, что совпадение на f
каким-то образом портит проверку типов.
Стоит отметить, что ограничение Show (HDK f a)
даже для упрощенного примера также дает ту же ошибку времени компиляции, что и в вопросе:
deriving instance (forall a. Show a => Show (HKD f a)) => Show (Result f)