мы используем синтаксис записей с именованными полями, то получаем функции для преобразования между новым типом и изначальным типом – а именно конструктор данных нашего типа >newtype
и функцию для извлечения значения из его поля. Для нового типа также автоматически не определяются экземпляры классов типов, для которых есть экземпляры исходного типа, поэтому нам необходимо их сгенерировать (ключевое слово >deriving
) либо определить вручную.
На деле вы можете воспринимать декларации >newtype
как декларации >data
, только с одним конструктором данных и одним полем. Если вы поймаете себя на написании такого объявления, рассмотрите использование >newtype
.
Ключевое слово >data
предназначено для создания ваших собственных типов данных. Ими вы можете увлечься не на шутку. Они могут иметь столько конструкторов и полей, сколько вы пожелаете, и использоваться для реализации любого алгебраического типа данных – всего, начиная со списков и >Maybe
-подобных типов и заканчивая деревьями.
Подведём итог вышесказанному. Используйте ключевые слова следующим образом:
• если вы просто хотите, чтобы ваши сигнатуры типов выглядели понятнее и были более наглядными, вам, вероятно, нужны синонимы типов;
• если вы хотите взять существующий тип и обернуть его в новый, чтобы определить для него экземпляр класса типов, скорее всего, вам пригодится >newtype
;
• если вы хотите создать что-то совершенно новое, есть шанс, что вам поможет ключевое слово >data
.