Изучай 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
>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 функции вызываются указанием имени функции и – через пробел – параметров, также разделённых пробелами. Для начала попробуем вызвать одну из самых скучных функций языка:
![Изучаем Java EE 7](/storage/book-covers/e0/e0ee9b7e3e4f168a93df98d7e47d66089eac3652.jpg)
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
![Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше](/storage/book-covers/d0/d0fc13172d4310c9da7b10ba57a3fcb2e3d9f10d.jpg)
Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.
![Перевод в электронный формат, кодированные наборы шрифтов и система Оптического Распознавания Символов для многошрифтовых информационных ресурсов на примере “Летописи журнальных статей”](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Java 7](/storage/book-covers/0c/0c854895249b5022dc4112a36f32ee3e02d18559.jpg)
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
![Экстремальное программирование. Разработка через тестирование](/storage/book-covers/dd/dda689ec4f767ab4657b7012084c0637cde96fb0.jpg)
Возвращение знаменитого бестселлера. Изящный, гибкий и понятный код, который легко модифицировать, который корректно работает и который не подкидывает своим создателям неприятных сюрпризов. Неужели подобное возможно? Чтобы достичь цели, попробуйте тестировать программу еще до того, как она написана. Именно такая парадоксальная идея положена в основу методики TDD (Test-Driven-Development – разработка, основанная на тестировании). Бессмыслица? Не спешите делать скороспелые выводы. Рассматривая применение TDD на примере разработки реального программного кода, автор демонстрирует простоту и мощь этой методики.
![Обработка событий в С++](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.