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 проверяет корректность типов, выявляя следующие некорректные конструкции, которые невозможно обнаружить одной лишь проверкой родов:

  • Конструктор типа, применённый к типу с forall (если расширение ImpredicativeTypes отключено)
  • Частично применённый синоним типа.

Например, следующий код будет отклонён:

type Pr = forall a. a

h :: [Pr]
h = ...

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

© 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.14.1/docs/users_guide/exts/liberal_type_synonyms.html

Spec-Zone.ru

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