Для регулярных ограничений карта перевода
class Colored a where
isRed :: a -> Bool
foo :: Colored a => T
в
newtype ColoredDict a = CD (a -> Bool)
foo :: ColoredDict a -> T
Аналогично,
bar :: (forall a. Colored a => Colored [a]) => U
можно перевести как
bar :: (forall a. ColoredDict a -> ColoredDict [a]) -> U
2) Предикат соответствует передаче словарного преобразователя в функцию.
Первый аргумент bar
- это "словарный преобразователь", который упоминает OP.
bar
включает в себя тип ранга 2, но Haskell использует их в течение длительного времени.
1) Уменьшите предикат Binary (f (GRose f a))
до Binary
(GRose f a)
Дело в том, что каждый раз, когда bar
необходимо разрешить ограничение Colored [t]
, он может использовать квантифицированное ограничение и вместо этого попытаться разрешить более простое ограничение Colored a
.