Как и списки покупок в реальном мире, списки в языке Haskell очень полезны. В данном разделе мы рассмотрим основы работы со списками, генераторами списков и строками (которые также являются списками).
Списки в языке Haskell являются гомогенными структурами данных; это означает, что в них можно хранить элементы только одного типа. Можно иметь список целых или список символов, но нельзя получить список с целыми числами и символами одновременно.
Списки заключаются в квадратные скобки, а элементы разделяются запятыми:
>ghci> let lostNumbers = [4,8,15,16,23,42]
>ghci> lostNumbers
>[4,8,15,16,23,42]
ПРИМЕЧАНИЕ. Можно использовать ключевое слово >let
, чтобы определить имя прямо в GHCi. Например, выполнение >let a = 1
из GHCi – эквивалент указания >a = 1
в скрипте с последующей загрузкой.
Объединение двух списков – стандартная задача. Она выполняется с помощью оператора >++
[5].
>ghci> [1,2,3,4] ++ [9,10,11,12] [1,2,3,4,9,10,11,12]
>ghci> "привет" ++ " " ++ "мир"
>"привет мир"
>ghci> ['в','о'] ++ ['-'] ++ ['о','т']
>"во-от"
ПРИМЕЧАНИЕ. Строки в языке Haskell являются просто списками символов. Например, строка >привет
– это то же самое, что и список >['п','р','и','в','е','т']
. Благодаря этому для работы со строками можно использовать функции обработки символов, что очень удобно.
Будьте осторожны при использовании оператора >++
с длинными строками. Если вы объединяете два списка (даже если в конец первого из них дописывается второй, состоящий из одного элемента, например >[1,2,3] ++ [4]
), то язык Haskell должен обойти весь список с левой стороны от >++
. Это не проблема, когда обрабатываются небольшие списки, но добавление к списку из 50 000 000 элементов займёт много времени. А вот если вы добавите что-нибудь в начало списка с помощью оператора >:
(также называемого «cons»), долго ждать не придётся.
>ghci> 'В':"ОТ КОШКА"
>"ВОТ КОШКА"
>ghci> 5:[1,2,3,4,5]
>[5,1,2,3,4,5]
Обратите внимание, что оператор >:
принимает число и список чисел или символ и список символов, в то время как >++
принимает два списка. Даже если вы добавляете один элемент в конец списка с помощью оператора >++
, следует заключить этот элемент в квадратные скобки, чтобы он стал списком:
>ghci> [1,2,3,4] ++ [5]
>[1,2,3,4,5]
Написать >[1,2,3,4] ++ 5
нельзя, потому что оба параметра оператора >++
должны быть списками, а >5
– это не список, а число.
Интересно, что >[1,2,3]
– это на самом деле синтаксический вариант >1:2:3:[]
. Список >[]
– пустой, и если мы добавим к его началу 3, получится