Конктруктор - является значением. Им можно оперировать в программе как любым дригим значением, Например как строкой или числом
Тип - работает так же как и в других языках
data 'тип' = 'конструктор'
- Единичный тип. Тип состоящий из одного конструктора
-
Объявление
data A = A
data A = B
Пространство имён типов не пересекается с пространством имён конструкторов,
поэтому конструктор можно называть так же как и тип.
В дальнейшем чтении не путать имена типов и имена конструторов * 1 -
Использование
Единичные типы данных не дают ничего, кроме знания о том, что он есть.
Из распространённых типов данных используютсяdata () = ()
data Unit = Unit
data 'тип' = 'конструктор' 'тип' ['может быть сколько угодно параметров']
-
Объявление
При объявлении мы указываем
'конструктор' 'тип'
.
В параметре конcтруктора указываеться тип значения которое он может приниматьdata A = A Int
data B = B String
data С = С Int String
data D = D A B
- конcтруктор
D
применяеться к типуA
который состоит из конструктораA Int
,
и к типуB
который состоит из конструктораB String
. см. * 1
- конcтруктор
-
Использование
При использовании мы указываем
'конструктор' 'значение'
Конструктор служит своеобразным контейнером для значения.A 10
B "СТРОКА"
C 10 "СТРОКА"
D (A 10) (B "СТРОКА")
data 'тип' 'общий_тип' = 'конструктор' 'общий_тип'
-
Объявление
Mожно не ограничеваться только примитивными типами при объявлении типа конструктора.
Для этого следует передавать общий тип.
Общий тип сам по себе конструктор не может принимать, его нужно передавать через типdata A a = A a
data B a b = A a b
-
Использование
A 10
A "СТРОКА"
B 10 "СТРОКА"
-
data Bool = False | True
-
data ABC = A | B | C
Суммарные типы данных названы потому, что они суммируют типы данных, которые их составляют.
Например, если суммировать единичные типы данных, получается перечисление.
-
data Pair a b = Pair a b
-
data Triple a b c = Triple a b c
Типы произведений названы так, что их можно представить как произведение нескольких типов, которые его составляют.
-
data Maybe a = Nothing | Just a
теперь мы можем комбинировать суммы типов с произведением, и получать более сложные типы
data List a = Nil | Cons a (List a)
- Записи
- Вставки или Враперы
- Степенные типы данных
- Фантомные типы данных
- Экзистенциальные типы данных
- Обобщённые Алгебраические Типы Данных (GADTs)
- Параметрические типы данных с ограниченными параметрами