Ответ 1
Понятия (как определено понятиями TS) и типы классов связаны только в том смысле, что они ограничивают множество типов, которые могут использоваться с общей функцией. Помимо этого, я могу только думать о том, как отличаются две функции.
Я должен отметить, что я не эксперт Haskell. Отнюдь не. Тем не менее, я эксперт по концепциям TS (я написал это, и я реализовал его для GCC).
-
Понятия (и ограничения) являются предикатами, которые определяют, является ли тип членом набора. Вам не нужно явно указывать, является ли тип моделью концепции (экземпляр класса типа). Это определяется набором требований и проверяется компилятором. Фактически, понятия не позволяют вам писать "
T
- это модельC
" вообще, хотя это легко поддерживается с использованием различных методов метапрограммирования. -
Понятия могут использоваться для ограничения аргументов, отличных от типа, и из-за функций
constexpr
и метапрограммирования шаблонов выражают почти любое ограничение, которое вы когда-либо могли бы написать (например, массив хэшей, объем которого должен быть простое число). Я не верю, что это верно для классов типов. -
Понятия не являются частью системы типов. Они ограничивают использование деклараций и, в некоторых случаях, вывод аргументов шаблона. Типы классов являются частью системы типов и участвуют в проверке типов.
-
Понятия не поддерживают модульную проверку или компиляцию. Определения шаблонов не проверяются на понятиях, поэтому вы можете по-прежнему получать запоздалые ошибки типа во время создания экземпляра, но это добавляет некоторую степень гибкости для библиотек (например, добавление кода отладки в алгоритм не приведет к изменению интерфейса). Поскольку классы типов являются частью системы типов, общие алгоритмы могут быть проверены и скомпилированы по модулю.
-
Концепции TS поддерживают специализацию общих алгоритмов и структур данных, основанных на упорядочении ограничений. Я вовсе не специалист в Haskell, поэтому я не знаю, есть ли здесь эквивалент или нет. Я не могу найти его.
-
Использование концепций никогда не добавит затрат времени исполнения. В прошлый раз, когда я смотрел, типы классов могли налагать одни и те же накладные расходы во время выполнения, как вызов виртуальной функции, хотя я понимаю, что Haskell очень хорошо оптимизирует их.
Я думаю, что это основные различия при сравнении функции (Concepts TS) с функцией (классы типа Haskell).
Но есть основополагающее философское различие на двух языках - и оно не является функциональным против любого вкуса С++, который вы пишете. Haskell хочет быть модульным: у него так много приятных свойств. Шаблоны С++ отказываются быть модульными: поиск экземпляров времени позволяет оптимизировать на основе типов без накладных расходов времени исполнения. Вот почему общие библиотеки С++ предлагают как широкое повторное использование, так и непревзойденную производительность.