Czy możliwe jest wprowadzenie dodatkowych zmiennych typu do ograniczenia superklasy?

W przypadku rodzin typów często przydatne jest użycie ograniczeń równości, aby uniknąć konieczności powtarzania nazwy funkcji typu w podpisie:

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

Działa to nawet wtedy, gdy skrót nie pojawia się w podpisie, tylko w ograniczeniach.

W przypadku klas najwyraźniej nie jest to możliwe;

class ( Foo f, b ~ BulkyAssociatedType f, Monoid b, ...) => Bar f

skarży się na zmienną typub nie w zakresie.

Czy jest jakiś sposób na osiągnięcie podobnej rzeczy, aby uniknąć odrobiny powtórzeń?

questionAnswers(1)

yourAnswerToTheQuestion