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

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

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

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


person Rexxar    schedule 08.04.2014    source источник
comment
Почему к этому вопросу добавлен тег language-lawyer?   -  person Rexxar    schedule 09.04.2014
comment
Потому что это не вопрос кода.   -  person Lightness Races in Orbit    schedule 09.04.2014
comment
programmers.stackexchange.com / questions / 127959 /   -  person Thomas Eding    schedule 09.04.2014


Ответы (2)


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


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

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

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

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

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

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

По крайней мере, мне кажется, что в основе концепции лежат механизмы определения абстрактных типов данных. Здесь мы начинаем видеть сходство с экзистенциальными типами: они моделируют ADT с помощью параметризации и, что более важно, позволяют вам определять ADT без раскрытия параметров.

Возьмем, к примеру, концепцию 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 - экзистенциальный тип.

person Stuart Olsen    schedule 09.04.2014
comment
так что любой общий, удовлетворяющий протоколу, является экзистенциальным? fn print<T : Printable>(T t) T - экзистенциальный - person v.oddou; 05.10.2018

Насколько мне известно, концепции 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. Концепции сделают это чище и проще в использовании.

Это опять же примерно мое понимание.

person iavr    schedule 08.04.2014
comment
Concepts lite - это предикаты произвольного типа. Первоначальный дизайн концептов был намного мощнее. - person Paul Fultz II; 09.04.2014
comment
вам не нужно enable_if, когда вы можете просто использовать static_assert - person v.oddou; 05.10.2018