data
и newtype
вводят новые типы (или фактически конструкторы типов - Maybe
не является типом, но Maybe a
является типом для любого a
, являющегося типом).
Объявление data
вводит как новый тип (что осталось от =
), так и способ представления данных этого типа (что справа от =
).
Так, например,если у вас есть объявление данных, подобное этому:
data SomeType = SomeConstructor
Затем вы ввели новый тип с именем SomeType
и способ создания значений SomeType
, а именно конструктор SomeConstructor
(который, кстати,не имеет никаких параметров, поэтому это единственное значение, присущее этому типу).
Класс типов не выполняет или этих вещей (как и instance
).Класс типов вводит ограничение и набор полиморфных функций, которые должны быть доступны при соблюдении этого ограничения.instance
в основном говорит, что «этот тип удовлетворяет этому ограничению», предоставляя реализацию для этих функций.Так что class
на самом деле не вводит новые типы, это просто способ обеспечить специальный полиморфизм для существующих типов.
Например, класс типов Show
примерно такой:
class Show a where -- a is an instance of Show if
show :: a -> String -- it has a function called show with this signature
(Обратите внимание, что класс Show
в Prelude
не вполне выглядит так)
show
теперь имеет тип Show a => a -> String
, который выможно прочитать как
для всех a, если они удовлетворяют ограничению Show
(или, альтернативно, если они являются экземпляром Show
), то эта функция принимает a
и возвращаетстрока
Экземпляр для этого будет выглядеть так:
instance Show SomeType where
show SomeConstructor = "SomeConstructor"
Это означает, что
SomeType
удовлетворяет ограничению Show
, иЯ покажу вам, как обеспечить реализацию show
Это примерно суть.Существуют языковые расширения, которые позволяют более сложным вещам происходить с классами типов и экземплярами, но пока вам не нужно об этом беспокоиться.