Являются ли универсальные типы подтипом или частным случаем экзистенциальных типов?


20

Я хотел бы знать, является ли универсально-количественный тип : T a = X : { a X , f : X { T , F } } подтипом или частным случаем экзистенциально-количественной оценки тип T e с той же сигнатурой: T e = X : { a X , f : X { T , F } }Ta

Ta=X:{aX,f:X{T,F}}
Te
Te=X:{aX,f:X{T,F}}

Я бы сказал «да»: если что-то верно «для всех X» ( ), то это также должно быть правдой «для некоторых X» ( X ). То есть утверждение с « » - это просто более ограниченная версия того же утверждения с « »: X , P ( X ) ?XX

X,P(X)?X,P(X).

Я где то не прав?

Фон: почему я спрашиваю это?

Я изучаю экзистенциальные типы, чтобы понять, почему и как «Абстрактные типы данных имеют экзистенциальный тип» . Я не могу получить хорошее представление об этой концепции только из теории; Мне тоже нужны конкретные примеры.

К сожалению, хорошие примеры кода трудно найти, потому что большинство языков программирования имеют ограниченную поддержку экзистенциальных типов. (Например, подстановочные знаки Хаскеллаforall или Java? .) С другой стороны, универсально количественно определенные типы поддерживаются многими современными языками посредством «обобщений».

Что еще хуже, дженерики, кажется, также легко смешиваются с экзистенциальными типами , что еще труднее отличить экзистенциальные от универсальных типов. Мне любопытно, почему эта путаница происходит так легко. Ответ на этот вопрос может объяснить это: если универсальные типы действительно являются лишь частным случаем экзистенциальных типов, то неудивительно, что универсальные типы, например Java List<T>, могут интерпретироваться в любом случае.


1
В чем даже разница между универсальным и экзистенциальным?

Говоря математически, вы правы: если forall x. P(x)тогда exists x. P(x). Учитывают ли системы типов это при проверке типов ... Понятия не имею. +1 за интересный вопрос.

1
@deinan: Если P (x) не выполняется для любого x , то, конечно, ∀xP (x) не выполняется. Что вы, вероятно, имели в виду, когда x не существует , то есть ∀x∈XP (x) не подразумевает ∃x∈XP (x), если X = ∅ .

1
... И обратите внимание, что если они будут переписаны без набора обозначений, они будут выглядеть по-разному: ∀xx∈X⇒P (x) против Xxx∈X & P (x) и что ∃xx∈X⇒P (x) будет тривиально удовлетворено ни й не из X .

1
Классный вопрос. В Haskell, безусловно, верно, что значение типа (forall b. Show b => b) может быть передано функции, которая принимает a (forall b. B), но не наоборот, подразумевая подменяемость, от которой вы ожидаете отношения подтипа. Но, конечно, когда вы говорите о типах, вы должны упомянуть систему типов, на которую вы смотрите, особенно если вы имеете в виду формальную алгебру типов для своей семантики ...

Ответы:


10

x:T,P(x)x:T,P(x)T

(x:T,P(x))(x:T,P(x))TaTe

Ta=X.{a:X,f:Xbool}AA(M)M:XM1M2XA(M1)A(M2)Ta

Te=X.{a:X,f:Xbool}BTeN:Xπ1(B)=Nπ2(B)={a:N,f:Nbool}N

Не вводите в заблуждение Хаскелла forall: несмотря на его название, это форма экзистенциального квантификатора.

Для справки я настоятельно рекомендую типы и языки программирования (главы 23 и 24 обсуждают универсальные типы и экзистенциальные типы соответственно). Это обеспечит полезную основу для понимания исследовательских статей.


1
Один незначительный и довольно поздний спор - Haskell forallдействительно является универсальным квантификатором в первоначальном контексте неявного количественного определения, которое он делает явным, а именно просмотр полиморфных типов «извне» для определений верхнего уровня. На «внутренней стороне» такого определения при манипулировании аргументами полиморфные типы являются фактически экзистенциальными; каждая переменная типа привязана к какому-либо типу, но мы не знаем (и не можем), что это за тип. Насколько мне известно, ни одна реализация Haskell не поддерживает истинные (необработанные, верхние уровни) экзистенциальные типы, и мне не ясно, для каких целей это вообще будет полезно.
CA McCann

1
Экзистенциальные типы, поддерживаемые GHC, - это типы, которые (прямо или косвенно) имеют универсальные квантификаторы, которые, если смотреть «извне», встречаются в противоположной позиции. При этом используется примерно та же двойственность, что и у логического отрицания, поэтому, чтобы иметь такие экзистенциальные типы на верхнем уровне, они должны быть вдвойне контравариантными, используя CPS-подобную кодировку (это эквивалентность, которую дает Удай Редди). Обратите внимание, что экзистенциальные кванторы в интуиционизме представляют аналогичные неудобства по аналогичным причинам.
CA McCann

5

X.P(X)X.P(X)

X.(X×(XBool))XX.(X×(XBool))

 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

Статья, которую вы упоминаете для экзистенциальных типов, немного теоретическая. Более учебная статья - статья Карделли и Вегнера: о понимании типов, абстракции данных и полиморфизме . В самых продвинутых учебниках по языкам программирования также обсуждаются экзистенциальные типы. Хорошая книга для поиска - « Основы языков программирования» Митчелла .

Вы правы в том, что большинство языков программирования не имеют явных экзистенциальных типов. Тем не менее, у многих есть абстрактные типы (или под некоторым другим именем, например, «пакеты» или «модули»). Таким образом, они могут выражать значения экзистенциальных типов, даже если они не рассматривают такие значения как первоклассные сущности.

X.P(X)Y.(X.P(X)Y)Y

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.