Haskell Language
Роль
Поиск…
Вступление
TypeFamilies
языка TypeFamilies
позволяет программисту определять функции уровня. Что отличает функции типа от конструкторов типа не-GADT, так это то, что параметры функций типа могут быть непараметрическими, тогда как параметры конструкторов типов всегда являются параметрическими. Это различие важно для правильности расширения GeneralizedNewTypeDeriving
. Чтобы объяснить это различие, роли внедряются в Haskell.
замечания
См. Также SafeNewtypeDeriving
.
Номинальная роль
Haskell Wiki имеет пример непараметрического параметра функции типа:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Здесь x
непараметрический, поскольку для определения результата применения параметра Inspect
к аргументу типа функция типа должна проверять x
.
В этом случае роль x
является номинальной. Мы можем явно объявить эту роль с расширением RoleAnnotations
:
type role Inspect nominal
Представительская роль
Пример параметрического параметра функции типа:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Здесь x
является параметрическим, потому что для определения результата применения DoNotInspect
к аргументу типа функция типа не нуждается в проверке x
.
В этом случае роль х является представительной. Мы можем явно объявить эту роль с расширением RoleAnnotations
:
type role DoNotInspect representational
Фантомная роль
Параметр фантомного типа имеет фантомную роль. Фантомные роли нельзя объявить явно.