-
LiberalTypeSynonyms -
- Подразумевает:
- Начиная с версии:
-
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.