Ist es möglich, zusätzliche Typvariablen in eine Oberklasseneinschränkung einzufügen?

Im Umgang mit Typfamilien ist es oft praktisch, Gleichheitsbeschränkungen zu verwenden, um zu vermeiden, dass der Name einer Typfunktion in einer Signatur wiederholt werden muss:

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

Dies funktioniert auch dann, wenn die Abkürzung nicht in der Signatur selbst auftaucht, sondern nur in den Einschränkungen.

Bei Klassen ist dies anscheinend nicht möglich;

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

beschwert sich über Typvariableb nicht im Geltungsbereich.

Ist es eine Möglichkeit, etwas Ähnliches zu erreichen, um ein bisschen Wiederholungskessel zu vermeiden?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage