Сообщение об ошибке вводит в заблуждение и вызывает сожаление - это не то, что вы делаете неправильно с кодом здесь, это происходит из-за того, как компилятор десагарсирует типы классов.
В настоящее время словарь представлен как запись, поэтому синоним, упомянутый в ошибке здесь, заключается в том, что компилятор создает что-то подобное для класса:
type NatClass n =
{ switch :: forall f. f NatZero -> (forall m. NatClass m => f (NatSucc m)) -> f n }
Так что он может выполнять довольно прямую замену ограничений на словарные аргументы.
Я думаю, что сейчас этот класс (или любой, который использует себя в качестве ограничения в члене) будет иметь ту же проблему.
Я давно хотел изменить представление для классов типов, и у меня есть WIP PR , я думаю, что после этого подобные вещи будут разрешены. После этого классы будут десагарации в тип data
, а не в синоним, поэтому ссылка должна быть разрешена.