1 На старт, внимание, марш!
Отлично, давайте начнём! Если вы принципиально не читаете предисловий к книгам, в данном случае вам всё же придётся вернуться назад и заглянуть в заключительную часть введения: именно там рассказано, что вам потребуется для изучения данного руководства и для загрузки программ.
Первое, что мы сделаем, – запустим компилятор GHC в интерактивном режиме и вызовем несколько функций, чтобы «прочувствовать» язык Haskell – пока ещё в самых общих чертах. Откройте консоль и наберите ghci. Вы увидите примерно такое приветствие:
GHCi, version 7.0.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude>
Поздравляю – вы в GHCi!
ПРИМЕЧАНИЕ. Приглашение консоли ввода – Prelude>, но поскольку оно может меняться в процессе работы, мы будем использовать просто ghci>. Если вы захотите, чтобы у вас было такое же приглашение, выполните команду :set prompt "ghci> ".
Немного школьной арифметики:
ghci> 2 + 15 17
ghci> 49 * 100
4900
ghci> 1892 – 1472 420
ghci> 5 / 2
2.5
Код говорит сам за себя. Также в одной строке мы можем использовать несколько операторов; при этом работает обычный порядок вычислений. Можно использовать и круглые скобки для облегчения читаемости кода или для изменения порядка вычислений:
ghci> (50 * 100) – 4999 1
ghci> 50 * 100 – 4999
1
ghci> 50 * (100 – 4999)
–244950
Здорово, правда? Чувствую, вы со мной не согласны, но немного терпения! Небольшая опасность кроется в использовании отрицательных чисел. Если нам захочется использовать отрицательные числа, то всегда лучше заключить их в скобки. Попытка выполнения 5 * –3 приведёт к ошибке, зато 5 * (–3) сработает как надо.
Булева алгебра в Haskell столь же проста. Как и во многих других языках программирования, в Haskell имеется два логических значения True и False, для конъюнкции используется операция && (логическое «И»), для дизъюнкции – операция || (логическое «ИЛИ»), для отрицания – операция not.
ghci> True && False False
ghci> True && True True
ghci> False || True True
ghci> not False
True
ghci> not (True&&True)
False
Можно проверить два значения на равенство и неравенство с помощью операций == и /=, например:
ghci> 5 == 5
True
ghci> 1 == 0
False
ghci> 5 /= 5
False
ghci> 5 /= 4
True
ghci> "привет" == "привет"
True
А что насчёт 5 + лама или 5 == True? Если мы попробуем выполнить первый фрагмент, то получим большое и страшное сообщение об ошибке[1]!
No instance for (Num [Char])
arising from a use of `+' at <interactive>:1:0–9
Possible fix: add an instance declaration for (Num [Char]) In the expression: 5 + "лама"
In the definition of `it': it = 5 + "лама"
Та-ак! GHCi говорит нам, что лама не является числом, и непонятно, как это прибавить к 5. Даже если вместо лама подставить четыре или 4, Haskell всё равно не будет считать это числом! Операция + ожидает, что аргументы слева и справа будут числовыми. Если же мы попытаемся посчитать True == 5, GHCi опять скажет нам, что типы не совпадают.
Несмотря на то что операция + производится только в отношении элементов, воспринимаемых как число, операция сравнения (==), напротив, применима к любой паре элементов, которые можно сравнить. Фокус заключается в том, что они должны быть одного типа. Вы не сможете сравнивать яблоки и апельсины. В подробностях мы это обсудим чуть позже.
ПРИМЕЧАНИЕ. Запись 5 + 4.0 вполне допустима, потому что 5 может вести себя как целое число или как число с плавающей точкой. 4.0 не может выступать в роли целого числа, поэтому именно число 5 должно «подстроиться».