Spec-Zone.ru › Haskell 9

6.8.2. Неразрешимые (или рекурсивные) суперклассы

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 будет расширять его только до конечной глубины.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/undecidable_super_classes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API