2016-07-01 3 views
1

В Haskell «типы» типов называются «Виды», обозначаемые как *. Такие, как в:Что такое «тип»?

Maybe :: * -> * 
Either :: * -> * -> * 

мне было интересно, если есть какой-либо эквивалент для «типов» видов в Haskell или других сильно типизированных языках?

Имеют ли они какое-либо практическое значение? Есть ли случаи, когда они оказываются очень полезными?

Любая ссылка на какой-либо материал будет оценена по достоинству.

+5

Я думаю, что они называют "сортирует". – melpomene

+4

, если я получу вас правильно, это то, что называется [Вселенные] (http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.UniversePolymorphism) в agda (ну это 'Set_2', но зачем останавливаться там ?) – Carsten

ответ

8

Начиная с GHC 8 и далее, в рамках марша к зависимым типам в Haskell, существует новое расширение -XTypeInType, что делает типы типов типами ... типами.

Когда включено TypeInType, существуют только два уровня в языке: термины и типы. И уровень типа сбрасывается на себя, так что тип (в терминах Haskell, «kind») типа снова является типом.

Prelude> :set -XTypeInType 
Prelude> import Data.Kind 
Prelude Data.Kind> :k Int 
Int :: * 
Prelude Data.Kind> :k (*) 
(*) :: * 

Также Type становится синонимом *, вид типов, которые имеют фактические значения на уровне термина:

Prelude Data.Kind> :k (Int :: *) 
(Int :: *) :: * 
Prelude Data.Kind> :k (Int :: Type) 
(Int :: Type) :: * 
Prelude Data.Kind> :k (Monad :: (Type -> Type) -> Constraint) 
(Monad :: (Type -> Type) -> Constraint) :: (* -> *) -> Constraint 

Это позволяет использовать с видами все machinery, что уже существует для типов, обогащая поддержку Haskell для тинаниганов типового уровня ценой inconsistent from a logical perspective (что не имеет значения, поскольку Haskell уже «несовместим», когда рассматривается как система доказательств, по целому ряду других причин).

+2

Вы говорите, что '* :: *' и что '*' - тип типов, которые имеют фактические значения на уровне термина. Оба они действительно верны? Есть ли у '*' жителя на уровне термина? –

+1

@ Даниэль Вагнер. Я исповедую, что я здесь не в своей глубине. Тем не менее, во время игры в ghci с активированным '-XTypeInType', ввод': t undefined :: Type' не дает ошибки типа, введя что-то вроде ': t undefined :: 'True'. – danidiaz

+0

Другой эксперимент: ': t undefined :: (sometype :: Type)' typechecks, как и ожидалось, в то время как ': t undefined :: (sometype :: Bool)' does not. – danidiaz

7

В Haskell «типы» типов называются «Виды», обозначаемые как *. Такие как:

Неправильное использование. * - вид типов, то есть таких объектов уровня, которые представляют собой набор & кинжал; возможных значений времени выполнения.

Термин вид - это немного оттенок. Это необходимо только потому, что Haskell (по уважительным причинам, не меньше!) Имеет четкое различие между временем компиляции и временем выполнения. Значения существуют только во время выполнения, все остальное существует только во время компиляции. В частности, тип таких значений существует только во время компиляции.

Теперь желательно также классифицировать типы, так же, как желательно классифицировать значения в типах. В принципе, нет причин не рассматривать типы, как и любые другие значения, и, следовательно, имеют типы типов. Это в значительной степени основополагающая идея языков с надписью типа Idris или Agda .

В Haskell это не совсем работает: из-за вышеупомянутого различия времени выполнения/компиляции вы не можете бросать типы и значения в один закрытый & ddagger; горшок. Таким образом, понятие видов: это также типы, но типы вещей, которые, в отличие от значений, также существуют во время компиляции, как сами виды, а не во время выполнения, как значения.

Это означает, что нет необходимости идти еще на один уровень от видов, потому что нет более раннего уровня, чем время компиляции. (Если вы не принести Template Haskell в игре,. Не знают, если кто-нибудь рассмотрели такие вопросы, пока)


& кинжал; Они на самом деле не наборы, но вид (каламбур не предназначен).

& ddagger;Закрыто в смысле: вы можете говорить о типах типов типов ... и никогда не нужно придумывать что-либо новое.

Я понимаю, что Agda до сих пор делает различие между типами, тип-типы и т.д. (Set_2 и так далее).Но я считаю, что это больше связано с тем фактом, что Agda является всего языка. Но я могу ошибаться.

+4

Не звучит правильно, различие фаз и квантификация являются ортогональными. В GHC 8 мы можем количественно определять виды, но это не меняет различие фаз. –

+0

@leftaroundabout Спасибо за отличный ответ. Можете ли вы рассказать о аналогии «закрытого горшка»? Я не мог понять. Спасибо. – zeronone