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

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

равно 5! Вы что, врун какой-нибудь?

В чисто функциональных языках у функций отсутствуют побочные эффекты. Функция может сделать только одно: рассчитать что-нибудь и возвратить это как результат. Поначалу такое ограничение смущает, но в действительности оно имеет приятные последствия: если функция вызывается дважды с одними и теми же параметрами, это гарантирует, что оба раза вернётся одинаковый результат. Это свойство называется ссылочной прозрачностью. Оно позволяет программисту легко установить (и даже доказать), что функция корректна, а также строить более сложные функции, объединяя простые друг с другом.

Haskell – ленивый язык. Это означает, что он не будет выполнять функции и производить вычисления, пока это действительно вам не потребовалось для вывода результата (если иное не указано явно). Подобное поведение возможно как раз благодаря ссылочной прозрачности. Если вы знаете, что результат функции зависит только от переданных ей параметров, неважно, в какой именно момент вы её вызываете. Haskell, будучи ленивым языком, пользуется этой возможностью и откладывает вычисления на то время, на какое это вообще возможно. Как только вы захотите отобразить результаты, Haskell проделает минимум вычислений, достаточных для их отображения. Ленивость также позволяет создавать бесконечные структуры данных, потому что реально вычислять требуется только ту часть структуры данных, которую необходимо отобразить.



Предположим, что у нас есть неизменяемый список чисел >xs = [1,2,3,4,5,6,7] и функция >doubleMe («УдвойМеня»), которая умножает каждый элемент на 2 и затем возвращает новый список. Если мы захотим умножить наш список на 8 в императивных языках, то сделаем так:

>doubleMe(doubleMe(doubleMe(xs)))

При вызове, вероятно, будет получен список, а затем создана и возвращена копия. Затем список будет получен ещё два раза – с возвращением результата. В ленивых языках программирования вызов >doubleMe со списком без форсирования получения результата означает, что программа скажет вам что-то вроде: «Да-да, я сделаю это позже!». Но когда вы захотите увидеть результат, то первая функция >doubleMe скажет второй, что ей требуется результат, и немедленно! Вторая функция передаст это третьей, и та неохотно вернёт удвоенную 1, то есть 2.

Вторая получит и вернёт первой функции результат – 4. Первая увидит результат и выдаст вам 8. Так что потребуется только один проход по списку, и он будет выполнен только тогда, когда действительно окажется необходим.

Язык Haskell – статически типизированный язык. Когда вы компилируете вашу программу, то компилятор знает, какой кусок кода – число, какой – строка и т. д. Это означает, что множество возможных ошибок будет обнаружено во время компиляции. Если, скажем, вы захотите сложить вместе число и строку, то компилятор вам «пожалуется».



В Haskell есть очень хорошая система типов, которая умеет автоматически делать вывод типов. Это означает, что вам не нужно описывать тип в каждом куске кода, потому что система типов может вычислить это сама. Если, скажем, >a = 5 + 4, то вам нет необходимости говорить, что >a – число, так как это может быть выведено автоматически. Вывод типов делает ваш код более универсальным. Если функция принимает два параметра и складывает их, а тип параметров не задан явно, то функция будет работать с любыми двумя параметрами, которые ведут себя как числа.

Haskell – ясный и выразительный язык, потому что он использует множество высокоуровневых идей; программы обычно короче, чем их императивные эквиваленты, их легче сопровождать, в них меньше ошибок.

Язык Haskell был придуман несколькими по-настоящему умными ребятами (с диссертациями). Работа по его созданию началась в 1987 году, когда комитет исследователей задался целью изобрести язык, который станет настоящей сенсацией. В 1999 году было опубликовано описание языка (Haskell Report), ознаменовавшее появление первой официальной его версии.

Что понадобится для изучения языка

Если коротко, то для начала понадобятся текстовый редактор и компилятор Haskell. Вероятно, у вас уже установлен любимый редактор, так что не будем заострять на этом внимание. На сегодняшний день самым популярным компилятором Haskell является GHC (Glasgow Haskell Compiler), который мы и будем использовать в примерах ниже. Проще всего обзавестись им, скачав Haskell Platform, которая включает, помимо прочего, ещё и массу полезных библиотек. Для получения Haskell Platform нужно пойти на сайт http://hackage.haskell.org/platform/ и далее следовать инструкциям по вашей операционной системе.

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

Как только вы установите Haskell Platform, откройте новое окно терминала – если, конечно, используете Linux или Mac OS X. Если же у вас установлена Windows, запустите интерпретатор командной строки (


Рекомендуем почитать
Программирование приложений для мобильных устройств под управлением Android. Часть 1

Книга посвящена разработке программ для мобильных устройств под управлением операционной системы Android. Рассматривается создание приложений с использованием системных компонентов и служб Android. Приведены базовые данные о структуре приложений, об основных классах и их методах, сопровождаемые примерами кода. Часть 1 содержит шесть глав, описывающих основные принципы создания приложений, пользовательский интерфейс, полномочия приложений, а так же базовые классы: Activity, Intent, Fragment. Книга предназначена для программистов, владеющих языком программирования Java и желающих освоить написание приложений, работающих под ОС Android.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Платформа J2Me

Эта книга научит вас, как разрабатывать программное обеспечение для платформы J2ME компании «Sun Microsystems». Эта книга придерживается стиля учебного пособия, это не справочное руководство.Цель — дать вам твердую основу в понятиях и техниках, которая даст вам возможность решиться на самостоятельную разработку качественных приложений.


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.


Исчерпывающее руководство по написанию всплывающих подсказок

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Создаем порт для FreeBSD своими руками. Часть II

Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?