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

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

). Далее введите >ghci и нажмите Enter. Если ваша система не найдёт программу GHCi, попробуйте перезагрузить компьютер.

Если вы определили несколько функций в сценарии, скажем, myfunctions.hs, то их можно загрузить в GHCi, напечатав команду >: l myfunctions. Нужно только убедиться, что файл myfunctions.hs находится в том же каталоге, из которого вы запустили GHCi.

Если вы изменили hs-сценарий, введите в интерактивном режиме >:l myfunctions, чтобы загрузить его заново. Можно также перегрузить загруженный ранее сценарий с помощью команды >: r. Обычно я поступаю следующим образом: определяю несколько функций в hs-файле, загружаю его в GHCi, экспериментирую с функциями, изменяю файл, перезагружаю его и затем всё повторяю. Собственно, именно этим мы с вами и займёмся.

Благодарности

Благодарю всех, кто присылал мне свои замечания, предложения и слова поддержки. Также благодарю Кита, Сэма и Мэрилин, которые помогли мне отшлифовать мастерство писателя.

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 :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 должно «подстроиться».

Вызов функций


Возможно, вы этого пока не осознали, но всё это время мы использовали функции. Например, операция >* – это функция, которая принимает два числа и перемножает их. Как вы видели, мы вызываем её, вставляя символ >* между числами. Это называется «инфиксной записью».

Обычно функции являются префиксными, поэтому в дальнейшем мы не будем явно указывать, что функция имеет префиксную форму – это будет подразумеваться. В большинстве императивных языков функции вызываются указанием имени функции, а затем её аргументов (как правило, разделённых запятыми) в скобках. В языке Haskell функции вызываются указанием имени функции и – через пробел – параметров, также разделённых пробелами. Для начала попробуем вызвать одну из самых скучных функций языка:


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

В наши дни компьютеры с несколькими многоядерными процессорами стали нормой. Стандарт С++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, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.