Изучай Haskell во имя добра! (Липовача) - страница 12

; если затем добавим в начало 2, получится >[2,3] и т. д.

ПРИМЕЧАНИЕ. Списки >[], >[[]] и >[[],[],[]] совершенно разные. Первый – это пустой список; второй – список, содержащий пустой список; третий – список, содержащий три пустых списка.

Обращение к элементам списка

Если вы хотите извлечь элемент из списка по индексу, используйте оператор >!!. Индексы начинаются с нуля.

>ghci> "Стив Бушеми" !! 5

>'Б'

>ghci> [9.4,33.2,96.2,11.2,23.25] !! 1

>33.2

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

Списки списков

Списки могут содержать другие списки. Также они могут содержать списки, которые содержат списки, которые содержат списки…

>ghci> let b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]

>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]