Список в функциональном языке Haskell - это структура данных, содержащая
произвольное (в т.ч. и бесконечное) количество элементов. Чтобы задать список в
Haskell, необходимо в квадратных скобках перечислить его элементы через
запятую. Все эти элементы должны принадлежать одному и тому же типу. Тип списка
с элементами, принадлежащими типу a, обозначается как [a]. В списке может не
быть ни одного элемента. Пустой список обозначается как []. Оператор :
(двоеточие) используется для добавления элемента в начало списка. Его левым
аргументом должен быть элемент (который называется головой списка), а правым — список (хвост списка):
Prelude>1:[2,3]
[1,2,3] ::
[Integer]
Prelude>’5’:[’1’,’2’,’3’,’4’,’5’]
[’5’,’1’,’2’,’3’,’4’,’5’]
:: [Char]
Prelude>False:[]
[False] :: [Bool]
Оператор (:) ассоциативен вправо. Элементами списка
могут быть любые значения — числа, символы, кортежи, другие списки и т.д.
Prelude>[(1,’a’),(2,’b’)]
[(1,’a’),(2,’b’)]
:: [(Integer,Char)]
Prelude>[[1,2],[3,4,5]]
[[1,2],[3,4,5]] :: [[Integer]]
Для работы со списками в языке Haskell
существует большое количество функций. Рассмотрим только некоторые из них.
-
Функция head возвращает
первый элемент списка.
-
Функция tail возвращает
список без первого элемента.
-
Функция length
возвращает длину списка.
Функции head и tail определены для
непустых списков. При попытке применить их к пустому списку интерпретатор
сообщает об ошибке. Примеры работы с указанными функциями:
Prelude>head [1,2,3]
1 :: Integer
Prelude>tail [1,2,3]
[2,3] :: [Integer]
Prelude>tail [1]
[] :: Integer
Prelude>length
[1,2,3]
3 :: Int
Обратите внимание, что результат функции
length принадлежит типу Int, а не типу Integer. Для соединения (конкатенации)
списков в Haskell определен оператор ++.
Prelude>[1,2]++[3,4]
[1,2,3,4] :: Integer
Рассмотрим примеры построения списков:
1.
Построить список
нечетных натуральных чисел
sp_nech
:: Integer -> [Integer]
sp_nech
0 = []
sp_nech
n = sp_nech (n-1) ++ [n]
Результат:
![]()
2.
Построить список треугольных чисел.
(n-ое треугольное число
tn равно количеству одинаковых монет, из
которых можно построить равносторонний треугольник, на каждой стороне которого укладывается n
монет. Нетрудно убедиться, что t1
= 1 и tn = n + tn−1)
sp_tr_ch
:: Integer -> [Integer]
tr_ch 1
= 1
tr_ch
(n) = n+tr_ch (n-1)
sp_tr_ch
0 = []
sp_tr_ch
n = sp_tr_ch (n-1) ++ [tr_ch (n)]
![]()
3.
Построить
список пирамидальных чисел. (n-е
пирамидальное число pn равно количеству одинаковых шаров, из которых
можно построить правильную пирамиду
с треугольным основанием, на каждой стороне
которой укладывается n шаров.
Нетрудно убедиться, что p1 = 1 и pn = tn + pn−1)
sp_pir
:: Integer -> [Integer]
pir 1 =
1
pir n =
n + pir(n-1)
p 1 = 1
p n =
pir (n) + p(n-1)
sp_pir
0 = []
sp_pir
n = sp_pir (n-1) ++ [p(n)]
Результат:
![]()
4.
Из списка
удалить элементы,
стоящие на чётных местах

Результат:
![]()
Литература
1.
С.В.
Зыков. Введение в теорию программирования.
Функциональный подход
2.
Л.В.
Городняя. Основы функционального
программирования
3.
С. Сильван. Сильные стороны языка Haskell