Ну и ну! Всё сломалось!.. Если нет сороконожки, нет и «головы». При использовании функций head
, tail
, last
и init
будьте осторожны – не применяйте их в отношении пустых списков. Эту ошибку нельзя отловить на этапе компиляции, так что всегда полезно предотвратить случайные попытки попросить язык Haskell выдать несколько элементов из пустого списка.
Функция length
, очевидно, принимает список и возвращает его длину:
ghci> length [5,4,3,2,1]
5
Функция null
проверяет, не пуст ли список. Если пуст, функция возвращает True
, в противном случае – False
. Используйте эту функцию вместо xs == []
(если у вас есть список с именем xs
).
ghci> null [1,2,3]
False
ghci> null []
True
Функция reverse
обращает список (расставляет его элементы в обратном порядке).
ghci> reverse [5,4,3,2,1]
[1,2,3,4,5]
Функция take
принимает число и список. Она извлекает соответствующее числовому параметру количество элементов из начала списка:
ghci> take 3 [5,4,3,2,1]
[5,4,3]
ghci> take 1 [3,9,3]
[3]
ghci> take 5 [1,2]
[1,2]
ghci> take 0 [6,6,6]
[]
Обратите внимание, что если попытаться получить больше элементов, чем есть в списке, функция возвращает весь список. Если мы пытаемся получить 0 элементов, функция возвращает пустой список.
Функция drop
работает сходным образом, но отрезает указанное количество элементов с начала списка:
ghci> drop 3 [8,4,2,1,5,6]
[1,5,6]
ghci> drop 0 [1,2,3,4]
[1,2,3,4]
ghci> drop 100 [1,2,3,4]
[]
Функция maximum
принимает список, состоящий из элементов, которые можно упорядочить, и возвращает наибольший элемент.
Функция minimum
возвращает наименьший элемент.
ghci> minimum [8,4,2,1,5,6]
1
ghci> maximum [1,9,2,3,4]
9
Функция sum
принимает список чисел и возвращает их сумму.
Функция product
принимает список чисел и возвращает их произведение.
ghci> sum [5,2,1,6,3,2,5,7]
31
ghci> product [6,2,1,2]
24
ghci> product [1,2,5,6,7,9,2,0]
0
Функция elem
принимает элемент и список элементов и проверяет, входит ли элемент в список. Обычно эта функция вызывается как инфиксная, поскольку так её проще читать:
ghci> 4 `elem` [3,4,5,6]
True
ghci> 10 `elem` [3,4,5,6]
False
Интервалы
А что если нам нужен список всех чисел от 1 до 20? Конечно, мы могли бы просто набрать их подряд, но, очевидно, это не решение для джентльмена, требующего совершенства от языка программирования. Вместо этого мы будем использовать интервалы.
Чтобы создать список, содержащий все натуральные числа от 1 до 20, достаточно написать [1..20]
. Это эквивалентно полной записи [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
, и единственная разница в том, что записывать каждый элемент списка, как показано во втором варианте, довольно глупо.
ghci> [1..20]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
ghci> ['a'..'z']
"abcdefghijklmnopqrstuvwxyz"
ghci> ['K'..'Z']
"KLMNOPQRSTUVWXYZ"
Интервалы замечательны ещё и тем, что они позволяют указать шаг. Что если мы хотим внести в список все чётные числа от 1 до 20? Или каждое третье число от 1 до 20?
ghci> [2,4..20]
[2,4,6,8,10,12,14,16,18,20]
ghci> [3,6..20]
[3,6,9,12,15,18]
Нужно всего лишь поставить запятую между первыми двумя элементами последовательности и указать верхний предел диапазона. Но, хотя интервалы достаточно «умны», на их сообразительность не всегда следует полагаться. Вы не можете написать [1,2,4,8,16..100]
и после этого ожидать, что получите все степени двойки. Во-первых, потому, что при определении интервала можно указать только один шаг. А во-вторых, потому что некоторые последовательности, не являющиеся арифметическими, неоднозначны, если представлены только несколькими первыми элементами.