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

Haskell Wiki хорошо объясняет, как использовать экзистенциальные типы, но я не совсем понимаю теорию, стоящую за ними.

Рассмотрим пример экзистенциального типа:

data S = forall a. Show a => S a      -- (1)

определить оболочку типа для вещей, которые мы можем преобразовать вString, В вики упоминается, что мыreally хочу определить тип как

data S = S (exists a. Show a => a)    -- (2)

то есть истинное "экзистенциальное" типа - слабо я думаю об этом как о "конструкторе данных"S принимает любой тип, для которогоShow примерexists и оборачивает это ". На самом деле, вы могли бы написать GADT следующим образом:

data S where                          -- (3)
    S :: Show a => a -> S

Я не пытался скомпилировать это, но похоже, что оно должно работать. Для меня GADT, очевидно, эквивалентен коду (2), который мы хотели бы написать.

Однако для меня совершенно не очевидно, почему (1) эквивалентно (2). Почему перемещение конструктора данных наружу превращаетforall вexists?

Самая близкая вещь, о которой я могу думать,Законы де Моргана в логике, где смена порядка отрицания и квантификатора превращает экзистенциальные квантификаторы в универсальные квантификаторы, и наоборот:

¬(∀x. px) ⇔ ∃x. ¬(px)

но конструкторы данных кажутся совершенно отличным от оператора отрицания.

Какая теория лежит в основе способности определять экзистенциальные типы, используяforall вместо несуществующегоexists?

Ответы на вопрос(3)

Ваш ответ на вопрос