Поиск…


Вступление

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

Фантомная роль

Параметр фантомного типа имеет фантомную роль. Фантомные роли нельзя объявить явно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow