Тип описывается (в сеансе GHCI) как:
$ ghci
Prelude> :info []
data [] a = [] | a : [a] -- Defined
Мы также можем думать об этом, как если бы оно было определено как:
data List a = Nil
| Cons a (List a)
или
data List a = EmptyList
| ListElement a (List a)
Тип Конструктор
[a]
- это полиморфный тип данных, который также может быть записан [] a
, как указано выше. Об этом можно думать так, как будто это List a
В этом случае []
является конструктором типа , принимающим один аргумент типа a
и возвращающим тип [] a
, который также можно записать как [a]
.
Можно написать тип функции, например:
sum :: (Num a) => [a] -> a
Конструктор данных
[]
- это конструктор данных , что по сути означает «пустой список». Этот конструктор данных не принимает аргументов значения.
Существует еще один конструктор данных, :
, который добавляет элемент в начало другого списка. Подпись для этого конструктора данных: a : [a]
- он принимает элемент и другой список элементов и возвращает результирующий список элементов.
Запись []
также может использоваться как сокращение для построения списка. Обычно мы строим список как:
myNums = 3 : 2 : 4 : 7 : 12 : 8 : []
что интерпретируется как
myNums = 3 : (2 : (4 : (7 : (12 : (8 : [])))))
но Haskell позволяет нам также использовать сокращение
myNums = [ 3, 2, 4, 7, 12, 8 ]
как эквивалент по смыслу, но немного приятнее по внешнему виду, обозначение.
Двусмысленный случай
Существует часто встречающийся неоднозначный случай: [a]
. В зависимости от контекста эта запись может означать «список из a
» или «список с ровно одним элементом, а именно a
». Первое значение - это предполагаемое значение, когда [a]
появляется в типе , а второе значение - это предполагаемое значение, когда [a]
появляется в значении .