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

Что означает экземпляр в Haskell?

В Java мы можем создавать объекты/экземпляры из классов. В Haskell мы можем создавать экземпляры классов типов, например:

data ShirtSize = S | M | L      -- Here ShirtSize is a enum data-type

class MyEq a where
  (==) :: a -> a -> Bool
instance MyEq ShirtSize where   -- Here ShirtSize is an instance of the MyEq type-class
  S == S = True
  M == M = True
  L == L = True
  _ == _ = False

Это не такой же вопрос, как: запутался в функции как экземпляр функтора в haskell Обс: Я не спрашиваю, как работает fmap, я спрашиваю, что такое экземпляр в Haskell означает средство декларации.

Мой вопрос: Что означает экземпляр в haskell? В java мы можем создавать экземпляры из классов, но в haskell кажется, что экземпляры представляют собой типы (например, ShirtSize), к которым вы можете применить функции класса типа (например, функцию (==) из MyEq). Я прав? а также что такое экземпляр в Haskell по сравнению с экземпляром/объектом в Java?

4b9b3361

Ответ 1

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

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

Кстати, класс Haskell (монопараметрический) несколько напоминает интерфейс Java и, как правило, класс Java. Или, возможно, экземпляр Haskell похож на Java-класс. Лучше рассматривать это как совпадение. Подходите к термину, учитывающему его математическое происхождение. Класс - это всего лишь куча вещей, которые принадлежат друг другу, и экземпляр - одна из этих вещей.

Ответ 2

Если вам интересно объяснение типов классов и отличия от интерфейсов Java, вы должны прочитать этот пост от < ❤ > . Это также объясняет примеры.

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

Если вам больше интересна модель классов типов, прочитайте это сообщение в блоге: http://www.haskellforall.com/2012/05/scrap-your-type-classes.html

Вы можете посмотреть экземпляры как значения! Это может сбить с ума, если вы впервые столкнетесь с таким определением.

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

В Идрисе есть "Eq a" тип, и могу ли я указать для него значение?