-
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 проверяет корректность типов, выявляя следующие некорректности, которые не обнаруживаются при простой проверке вида:
- Конструктор типа применяется к типу, включающему for-all (если
ImpredicativeTypesвыключен) - Частично применённый синоним типа.
Таким образом, например, это будет отклонено:
type Pr = forall a. a h :: [Pr] h = ...
потому что GHC не допускает применения конструкторов типов к типам for-all.