Подтвердить что ты не робот

Как понятия С++ отличаются от классов Haskell?

Концепции для С++ из концепций TS недавно были объединены в магистраль GCC. Концепции позволяют ограничивать общий код, требуя, чтобы типы удовлетворяли условиям концепции (например, "Comparable" ).

Haskell имеет классы типов. Я не так хорошо знаком с Хаскеллом. Как связаны понятия и классы типов?

4b9b3361

Ответ 1

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

Я должен отметить, что я не эксперт Haskell. Отнюдь не. Тем не менее, я эксперт по концепциям TS (я написал это, и я реализовал его для GCC).

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

  • Понятия могут использоваться для ограничения аргументов, отличных от типа, и из-за функций constexpr и метапрограммирования шаблонов выражают почти любое ограничение, которое вы когда-либо могли бы написать (например, массив хэшей, объем которого должен быть простое число). Я не верю, что это верно для классов типов.

  • Понятия не являются частью системы типов. Они ограничивают использование деклараций и, в некоторых случаях, вывод аргументов шаблона. Типы классов являются частью системы типов и участвуют в проверке типов.

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

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

  • Использование концепций никогда не добавит затрат времени исполнения. В прошлый раз, когда я смотрел, типы классов могли налагать одни и те же накладные расходы во время выполнения, как вызов виртуальной функции, хотя я понимаю, что Haskell очень хорошо оптимизирует их.

Я думаю, что это основные различия при сравнении функции (Concepts TS) с функцией (классы типа Haskell).

Но есть основополагающее философское различие на двух языках - и оно не является функциональным против любого вкуса С++, который вы пишете. Haskell хочет быть модульным: у него так много приятных свойств. Шаблоны С++ отказываются быть модульными: поиск экземпляров времени позволяет оптимизировать на основе типов без накладных расходов времени исполнения. Вот почему общие библиотеки С++ предлагают как широкое повторное использование, так и непревзойденную производительность.

Ответ 2

Вам может быть интересен следующий исследовательский документ:

"Сравнение понятий С++ и классов типа Haskell", Бернарди и др., WGP 2008. Pdf Подробнее.

Обновление: как краткое резюме статьи: документ определяет точное сопоставление терминологии для понятий С++ и терминологию для классов типа Haskell и использует это сопоставление для обеспечения детального сравнения функций между ними.

В их заключении говорится:

Из наших 27 критериев, приведенных в таблице 2, 16, одинаково поддерживаются на обоих языках, и только один или два не переносимы. Таким образом, мы можем с уверенностью заключить, поскольку мы начали - концепции С++ и классы типа Haskell очень похожи.

Как отмечено T.C. ниже, стоит отметить, что в документе сравниваются понятия С++ 0x, а не понятия TS. Я не знаю хорошей ссылки, описывающей различия.