Мы только что воспользовались условной конструкцией if
if
в Haskell и операторами if
из императивных языков заключается в том, что ветвь else
в языке Haskell является обязательной. В императивных языках вы можете просто пропустить пару шагов, если условие не выполняется, а в Haskell каждое выражение или функция должны что-то возвращать[4].Можно было бы написать конструкцию if
5
– это выражение, потому что возвращает 5; 4 + 8
– выражение, x + y
– тоже выражение, потому что оно возвращает сумму Поскольку ветвь else
if
всегда что-нибудь вернёт, ибо является выражением. Если бы мы хотели добавить единицу к любому значению, получившемуся в результате выполнения нашей предыдущей функции, то могли бы написать её тело вот так:doubleSmallNumber' x = (if x > 100 then x else x*2) + 1
Если опустить скобки, то единица будет добавляться только при условии, что x
'
) в конце имени функции. Он не имеет специального значения в языке Haskell. Это допустимый символ для использования в имени функции.Обычно мы используем символ прямого апострофа '
conanO'Brien = "Это я, Конан О'Брайен!"
Здесь следует обратить внимание на две важные особенности. Во-первых, в названии функции мы не пишем имя conan
Когда функция не принимает аргументов, говорят, что это
conanO'Brien
и строка "Это я, Конан О'Брайен!"
могут использоваться взаимозаменяемо.Списки
Как и списки покупок в реальном мире, списки в языке Haskell очень полезны. В данном разделе мы рассмотрим основы работы со списками, генераторами списков и строками (которые также являются списками).
Списки в языке Haskell являются
Списки заключаются в квадратные скобки, а элементы разделяются запятыми:
ghci> let lostNumbers = [4,8,15,16,23,42]
ghci> lostNumbers
[4,8,15,16,23,42]
ПРИМЕЧАНИЕ. Можно использовать ключевое слово let
let a = 1
из GHCi – эквивалент указания a = 1
в скрипте с последующей загрузкой.Конкатенация
Объединение двух списков – стандартная задача. Она выполняется с помощью оператора ++
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 элементов займёт много времени. А вот если вы добавите что-нибудь в начало списка с помощью оператора :
(также называемого «ghci> 'В':"ОТ КОШКА"
"ВОТ КОШКА"