Можно ли ввести дополнительные переменные типа в ограничение суперкласса?
При работе с семействами типов часто удобно использовать ограничения на равенство, чтобы избежать необходимости повторения некоторой функции типа 'имя в подписи:
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
Это работает, даже если сокращение нене в самой подписи, только в ограничениях.
С классами это, по-видимому, невозможно;
class ( Foo f, b ~ BulkyAssociatedType f, Monoid b, ...) => Bar f
жалуется на переменную типаb
не быть в сфере.
Есть ли какой-то способ достичь подобной вещи, чтобы избежать частых повторений?