-
UndecidableSuperClasses -
- Since:
-
8.0.1
Разрешаются все ограничения суперклассов, включая те, которые могут привести к неокончанию работы типовой проверки.
Расширение языка UndecidableSuperClasses позволяет гораздо более гибкие ограничения в суперклассах.
Класс не может, как правило, иметь сам себя в качестве суперкласса. Поэтому это незаконно
class C a => D a where ... class D a => C a where ...
GHC реализует эту проверку консервативно, когда задействованы функции типов или переменные типов. Например
type family F a :: Constraint class F a => C a where ...
GHC будет жаловаться на это, так как вы можете позже добавить
type instance F Int = C Int
и теперь мы попадем в цикл суперклассов. Вот пример, включающий переменную типа
class f (C f) => C f class c => Id c
Если мы расширим суперклассы C Id, то получим сначала Id (C Id), а затем снова C Id.
Однако такие ограничения суперклассов иногда полезны, а консервативная проверка раздражает, когда фактическая рекурсия отсутствует.
Кроме того, истинно рекурсивные суперклассы иногда полезны. Вот реальный пример (#10318)
class (Frac (Frac a) ~ Frac a,
Fractional (Frac a),
IntegralDomain (Frac a))
=> IntegralDomain a where
type Frac a :: Type
Здесь цикл суперклассов завершается, но не совсем очевидно, что он завершается.
С расширением языка UndecidableSuperClasses GHC снимает все ограничения на ограничения суперклассов. Если действительно есть цикл, GHC будет расширять его только до конечной глубины.