Изучай Haskell во имя добра! - [7]

Шрифт
Интервал

>ghci> b

>[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]

>ghci> b ++ [[1,1,1,1]]

>[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]]

>ghci> [6,6,6]:b

>[[6,6,6],[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]

>ghci> b !! 2

>[1,2,2,3,4]

Вложенные списки могут быть разной длины, но не могут быть разных типов. Подобно тому как нельзя создать список, содержащий несколько символов и несколько чисел, нельзя создать и список, содержащий несколько списков символов и несколько списков чисел.

Сравнение списков

Списки можно сравнивать, только если они содержат сравнимые элементы. При использовании операторов ><, ><=, >>= и >> сравнение происходит в лексикографическом порядке. Сначала сравниваются «головы» списков; если они равны, то сравниваются вторые элементы. Если равны и вторые элементы, то сравниваются третьи – и т. д., пока не будут найдены различающиеся элементы. Результат сравнения списков определяется по результату сравнения первой пары различающихся элементов.

Сравним для примера >[3,4,2]<[3,4,3]. Haskell видит, что >3 и >3 равны, поэтому переходит к сравнению >4 и >4, но так как они тоже равны, сравнивает >2 и >3. Число >2 меньше >3, поэтому первый список меньше второго. Аналогично выполняется сравнение на ><=, >>= и >>:

>ghci> [3,2,1] > [2,1,0]

>True

>ghci> [3,2,1] > [2,10,100]

>True

>ghci> [3,4,2] < [3,4,3]

>True

>ghci> [3,4,2] > [2,4]

>True

>ghci> [3,4,2] == [3,4,2]

>True

Непустой список всегда считается больше, чем пустой. Это позволяет сравнивать друг с другом любые два списка, даже если один из них точно совпадает с началом другого.

Другие операции над списками

Что ещё можно делать со списками? Вот несколько основных функций работы с ними.

Функция >head принимает список и возвращает его головной элемент. Головной элемент списка – это, собственно, его первый элемент.

>ghci> head [5,4,3,2,1]

>5

Функция >tail принимает список и возвращает его «хвост». Иными словами, эта функция отрезает «голову» списка и возвращает остаток.

>ghci> tail [5,4,3,2,1]

>[4,3,2,1]

Функция >last принимает список и возвращает его последний элемент.

>ghci> last [5,4,3,2,1]

>1

Функция >init принимает список и возвращает всё, кроме его последнего элемента.

>ghci> init [5,4,3,2,1]

>[5,4,3,2]

Если представить список в виде сороконожки, то с функциями получится примерно такая картина:



Но что будет, если мы попытаемся получить головной элемент пустого списка?

>ghci> head []

>*** Exception: Prelude.head: empty list

Ну и ну! Всё сломалось!.. Если нет сороконожки, нет и «головы». При использовании функций >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? Конечно, мы могли бы просто набрать их подряд, но, очевидно, это не решение для джентльмена, требующего совершенства от языка программирования. Вместо этого мы будем использовать интервалы. Интервалы – это способ создания списков, являющихся арифметическими последовательностями элементов, которые можно перечислить по порядку: один, два, три, четыре и т. п. Символы тоже могут быть перечислены: например, алфавит – это перечень символов от A до Z. А вот имена перечислить нельзя. (Какое, например, имя будет идти после «Иван»? Лично я понятия не имею!)

Чтобы создать список, содержащий все натуральные числа от 1 до 20, достаточно написать


Рекомендуем почитать
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ

В наши дни компьютеры с несколькими многоядерными процессорами стали нормой. Стандарт С++11 языка С++ предоставляет развитую поддержку многопоточности в приложениях. Поэтому, чтобы сохранять конкурентоспособность, вы должны овладеть принципами и приемами их разработки, а также новыми средствами языка, относящимися к параллелизму.Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11.


Дефрагментация мозга. Софтостроение изнутри

Эта книга для тех, кто давно связан с разработкой программного обеспечения. Или для тех, кто еще думает выбрать программирование своей профессией. Или для тех, кто просто привык думать и размышлять о происходящем в мире информационных технологий.Не секрет, что основная масса софтостроения сосредоточена в секторе так называемой корпоративной разработки: от комплексных информационных систем предприятия до отдельных приложений. Поэтому немалая часть сюжетов касается именно Enterprise Programming.Из текста вы вряд ли узнаете, как правильно склеивать многоэтажные постройки из готовых компонентов в гетерогенной среде, проектировать интерфейсы, синхронизировать процессы или писать эффективные запросы к базам данных.


Справочник по JavaScript

Вниманию читателей предлагается справочник по JavaScript.Справочник предназначается для людей, уже освоивших азы программирования в JavaScript.Справочник создан на основе информации, предоставленной на сайте «Справочник Web-языков» www.spravkaweb.ru.Дата выхода данной версии справочника: 12:33, 21 марта 2007.


Справочник по PHP

Вниманию читателей предлагается справочник по PHP.Справочник предназначается для людей, уже освоивших азы программирования на языке PHP.Справочник создан на основе информации, предоставленной на сайте «Справочник Web-языков» www.spravkaweb.ru.


Fiction Book Designer Краткое руководство

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Программирование на Visual C++. Архив рассылки

РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.