Являются ли концепции C++ формой экзистенциального типа?


Я смотрел определение экзистенциальных типов в Википедии (Existential_types), и оно похоже в некотором смысле на понятия в C++ (в частности, на concepts lite).

Являются ли понятия C++ формой экзистенциального типа?

Если нет, то в чем разница между ними?

2 10

2 ответа:

TL; DR : Да, понятия являются (или, по крайней мере, позволяют определить) экзистенциальными типами.


Вот мои рассуждения, хотя будьте осторожны; я не теоретик типов:

Рассмотрим определение в Википедии абстрактного типа данных (Курсив мой):

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

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

По номинальной стоимости концепт, с другой стороны, является предикатом на единицу (ноль?) или несколько типов, которые можно использовать для ограничения шаблонов. Не очевидно, что они имеют какое - либо отношение к экзистенциальным типам-пока вы не рассмотрите предложения requires.

В принципе, requires позволяет проверять определенные свойства типов. Среди них-определяют ли они определенный тип элемента, имеют ли определенную функцию-член, преобразуются ли в определенные типы и т. д. Это наблюдение (с главный пункт дизайна, на самом деле) - это то, где лежит мясо материи.

По крайней мере, мне кажется, что фундаментальные понятия-это механизм определения абстрактных типов данных. Именно здесь мы начинаем видеть сходство с экзистенциальными типами: они моделируют Адт путем параметризации и, что более важно, позволяют определить АДТ , не раскрывая параметры. Возьмем, к примеру, понятие Container. Вы можете, с помощью Concepts Lite, написать что-нибудь как
void print (Container c) {
    for (const auto& e : c)
        print (e);
}

// Later
print (std::vector <int> {1, 2, 3, 4});

Это работает потому, что существует некоторый типI такой, что выражения begin (c) и end (c) возвращают объекты типа I вместе с другими ограничениями Container. Это экзистенциальная квантификация; Container - экзистенциальный тип.

Насколько мне известно, понятия C++ - это предикаты произвольного типа. Работа над концепциями C++ больше концентрируется на том, как эти предикаты интегрируются в язык, а не на придании конкретного значения или определении математической / логической модели. Идея заключается в том, что именно как функция

void f(double x);

Явно ожидает параметр типа double, таким простым способом

template <Container C>
void f(const C& c);

Ожидает не просто typename, а Container. Теперь, как определяется Container? Это может быть так например

template <typename T>
struct Container: std::false_type { };

template <typename T, size_t N>
struct Container <std::array<T, N> >: std::true_type { };

template <typename T, typename A>
struct Container <std::vector<T, A> >: std::true_type { };

И так далее. Предикаты типа Container существуют и сейчас, но для их интеграции в шаблонную функцию требуются неудобные конструкции типа std::enable_if. Концепции сделают это чище и проще в использовании.

Это опять же, только приблизительно мое понимание.