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
Фантомная роль
Параметр фантомного типа имеет фантомную роль. Фантомные роли нельзя объявить явно.