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ń?