Являются ли концепции C++ формой экзистенциального типа?
Я смотрел определение экзистенциальных типов в Википедии (Existential_types), и оно похоже в некотором смысле на понятия в C++ (в частности, на concepts lite).
Являются ли понятия C++ формой экзистенциального типа?
Если нет, то в чем разница между ними?
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
. Концепции сделают это чище и проще в использовании.Это опять же, только приблизительно мое понимание.