É possível introduzir variáveis de tipo adicionais em uma restrição de superclasse?
Ao lidar com famílias de tipos, geralmente é útil usar restrições de igualdade para evitar a necessidade de repetir o nome de alguma função de tipo em uma assinatura:
class Foo f where
type BulkyAssociatedType f :: *
foo :: BulkyAssociatedType f -> f
...
bar :: forall m f b .
( Monad m, Foo f, b ~ BulkyAssociatedType f
, Monoid b, Monoid (m b)
) => f -> m f
Isso funciona mesmo que a abreviação não apareça na própria assinatura, apenas nas restrições.
Com as aulas, isso aparentemente não é possível;
class ( Foo f, b ~ BulkyAssociatedType f, Monoid b, ...) => Bar f
reclama sobre a variável de tipob
não estar no escopo.
Existe alguma maneira de conseguir algo semelhante, para evitar um pouco de repetições?