В чем разница между "классом" в Haskell и "абстрактным классом" в ОО-языке? - PullRequest
5 голосов
/ 15 октября 2010

На первый взгляд, существуют очевидные различия между двумя видами «класса».Тем не менее, я считаю, что есть больше сходства:

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

Я вижу, что "класс" гораздо более лаконичен в Haskell, а также более эффективен.Но у меня есть ощущение, что теоретически «класс» и «абстрактный класс» идентичны.

Каково ваше мнение?

Ответы [ 4 ]

7 голосов
/ 15 октября 2010

Э-э, не совсем, нет.

С одной стороны, классы типов в Haskell не имеют конструкторов; типы данных делают.

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

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

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

4 голосов
/ 15 октября 2010

Помимо различий в реализации, одно существенное концептуальное различие касается того, когда классы / классы типов объявлены.

Если вы создаете новый класс, MyClass, например, Java или C #, вам нужно указать все интерфейсы, которые он предоставляет во время разработки класса. Теперь, если вы свяжете свой код с библиотекой и предоставите его третьей стороне, они будут ограничены интерфейсами, которые вы выбрали для класса. Если им нужны дополнительные интерфейсы, им нужно создать производный класс, OurDerivedClass. К сожалению, ваша библиотека может делать копии или MyClass, не зная производного класса, и может возвращать новые экземпляры через свои интерфейсы, которые они затем должны будут обернуть. Таким образом, чтобы действительно добавить новые интерфейсы в класс, им нужно было бы добавить новый слой поверх вашей библиотеки. Не элегантный и не очень практичный.

С классами типов вы указываете интерфейсы, которые тип предоставляет отдельно от определения типа. Если сторонняя библиотека теперь содержит YourType, я могу просто создать экземпляр YourType, который будет принадлежать новым интерфейсам (которые вы не предоставили при создании типа) в моем собственном коде.

Таким образом, классы типов позволяют пользователю типа контролировать, с какими интерфейсами придерживается тип, в то время как с «нормальными» классами разработчик класса в контроле (и должен иметь хрустальный шар, необходимый для того, чтобы увидеть все возможные вещи для того, что пользователь может захотеть использовать в классе).

2 голосов
/ 15 октября 2010

From: http://www.haskell.org/tutorial/classes.html

Прежде чем перейти к дальнейшим примерам использования классов типов, стоит указать два других представления классов типов Haskell.Первый по аналогии с объектно-ориентированным программированием (ООП).В следующем общем утверждении об ООП, просто подставляя класс типа для класса и тип для объекта, вы получите правильную сводку механизма классов классов Хаскелла:

"Классы захватывают общие наборы операций. Конкретный объект может бытьэкземпляра класса, и будет иметь метод, соответствующий каждой операции. Классы могут быть расположены иерархически, формируя представления о суперклассах и подклассах и разрешая наследование операций / методов. Метод по умолчанию также может быть связан с операцией. "

В отличие от ООП, должно быть ясно, что типы не являются объектами, и, в частности, нет понятия внутреннего изменяемого состояния объекта или типа.Преимущество перед некоторыми языками ООП состоит в том, что методы в Haskell полностью безопасны по типу: любая попытка применить метод к значению, тип которого не входит в требуемый класс, будет обнаружен во время компиляции, а не во время выполнения.Другими словами, методы не «ищутся» во время выполнения, а просто передаются как функции более высокого порядка.

0 голосов
/ 15 октября 2010

Это слайд-шоу может помочь вам понять сходства и различия между абстрактными классами ОО и классами типов Haskell: Классы, Джим, но не так, как мы их знаем .

...