Spec-Zone.ru › Haskell 9

6.4.5. Свободные типы синонимов

LiberalTypeSynonyms
Подразумевает:

ExplicitForAll

С тех пор как:

6.8.1

Снимает многие правила Haskell 98 для определения синонимов типов.

Синонимы типов похожи на макросы на уровне типов, но Haskell 98 накладывает множество правил на отдельные объявления синонимов. С расширением LiberalTypeSynonyms GHC проверяет корректность типов только после расширения синонимов типов. Это означает, что GHC может быть гораздо более либеральным по отношению к синонимам типов, чем Haskell 98.

  • Вы можете применить синоним типа к типу forall:

    type Foo a = a -> a -> Bool
    
    f :: Foo (forall b. b->b)
    

    После расширения синонима, f имеет законный (в GHC) тип:

    f :: (forall b. b->b) -> (forall b. b->b) -> Bool
    
  • Вы можете применить синоним типа к частично применённому синониму типа:

    type Generic i o = forall x. i x -> o x
    type Id x = x
    
    foo :: Generic Id []
    

    После расширения синонима, foo имеет законный (в GHC) тип:

    foo :: forall x. x -> [x]
    

GHC выполняет проверку вида до расширения синонимов.

После расширения синонимов типов GHC проверяет корректность типов, выявляя следующие некорректности, которые не обнаруживаются при простой проверке вида:

  • Конструктор типа применяется к типу, включающему for-all (если ImpredicativeTypes выключен)
  • Частично применённый синоним типа.

Таким образом, например, это будет отклонено:

type Pr = forall a. a

h :: [Pr]
h = ...

потому что GHC не допускает применения конструкторов типов к типам for-all.

© 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/liberal_type_synonyms.html

Spec-Zone.ru

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