edit

Зачем нужно функциональное программирование? Зачем нужен Haskell?

event Wed 12 Dec '12
label переводы, realworldhaskell
language ru
link source
code code

От переводчика

Недавно я решил всё-таки доучить Haskell, и после недолгих поисков нашёл замечательную книгу Real World Haskell. Книга только на английском, русский перевод найти не получилось. Лично мне всё равно, я английский знаю на достаточном уровне, чтобы читать такую литературу, но уж больно книга хороша, потому захотелось поделиться с русскоговорящей аудиторией. Кроме того в процессе перевода лучше вникаешь в смысл текста, что тоже очень хорошо для меня =)

Оригинал книги доступен онлайн бесплатно по лицензии CC, либо под заказ в печатном виде с Амазона или O'Reilly. Все подробности по ссылке выше.

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

Все права на оригинал принадлежат авторам: Bryan O'Sullivan, Don Stewart, and John Goerzen

Права на перевод оставляю за собой (см. копирайт в подвале страницы).

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

У нас к тебе предложение!

Haskell — очень обширный язык, и мы думаем, что его изучение даст вам очень многое. Мы остановимся на трёх вещах (и сейчас объясним почему). Во-первых на новизне: мы предлагаем рассмотреть программирование с иной очень ценной стороны. Во-вторых на силе языка: мы покажем, как писать программы кратко, быстро и надёжно. И напоследок, мы предлагаем просто удовольствие от применения красивых техник программирования для решения реальных проблем.

Новизна

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

В Haskell-е мы отходим от кода, который модифицирует данные. Вместо этого в центре внимания оказываются функции, принимающие неизменяемые значения на вход и выдающие новые значения на выходе. При одних и тех же входных данных функция возвращает один и тот же результат. Это и есть основная идея функционального программирования.

Вместе с немодифицирующимися данными, наши программы на Haskell-е обычно не общаются с внешним миром. Мы называем такие функции чистыми. Мы делаем явное различие между чистым кодом и частями наших программ, которые читают и пишут в файлы, работают с сетью или управляют роботами. Таким образом нам становится легче организовать код, понять его и протестировать.

Мы отказываемся от некоторых, как кажется, фундаментальных основ, вроде цикла for, встроенного в язык. У нас есть другие, более гибкие способы организации повторяющихся задач.

Даже выражения в Haskell-е вычисляются по-другому. Мы откладываем каждое вычисление до того момента, когда его результат действительно понадобиться: Haskell — ленивый язык. Ленивость — не просто откладывание работы на потом, она в корне меняет то, как пишутся программы.

Сила языка

На протяжении всей книги мы покажем насколько альтернативные традиционным языкам фичи Haskell-а мощные, гибкие и позволяют писать надёжный код. Haskell огромное число самых передовых идей по созданию великолепных программ.

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

Чистый код проще тестировать, чем код, который общается с внешним миром. Когда функция только отвечает на её невидимые входные данные, мы может очень просто установить правила её поведения, которые будут всегда верными. Мы можем автоматически протестировать и убедиться, что поведение функции сохраняется при огромном потоке случайных входных данных, а когда наши тесты завершатся, мы можем разрабатывать дальше. Мы по прежнему используем традиционные техники для тестирования кода, который должен взаимодействовать с файлами, сетью или некими экзотическими устройствами. Посколько не чистого кода в Haskell-е гораздо меньше, чем в традиционных языках, мы более уверены в надёжности нашего ПО.

Ленивые вычисления порой дают странные эффекты. Скажем, мы хотим получить k наименьших элемента из несортированного списка. В традиционном языке очевидным подходом будет отсортировать список и взять k первых элемента, но это слишком накладно. Для эффективности нам придётся написать специальную функцию, которая берёт эти значения из списка в один проход. Этой функции придётся поддерживать не совсем тривиальный набор данных для отслеживания состояния перебора. В Haskell-е подход «отсортировать-и-выбрать» работает прекрасно: благодаря ленивости языка список будет отсортирован лишь настолько, чтобы найти k минимальных элемента.

Что ещё лучше, наш код на Haskell-е, работающий так эффективно, очень краток и использует только стандартные библиотечные функции.

-- file: ch00/KMinima.hs
-- lines beginning with "--" are comments.

minima k xs = take k (sort xs)

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

Как видно из примера выше, важный аспект программирования на Haskell-е — краткость кода. По сравнению с другими популярными языками, на Haskell-е обычно пишется меньше кода за гораздо меньшее время и с меньшим количеством багов.

Удовольствие

Мы уверены, что понять основы программирования на Haskell-е просто, что вы сможете успешно писать небольшие программки буквально за часы или дни изучения языка.

Но поскольку эффективное программирование на Haskell-е значительно отличается от программирования на других языках, будьте готовы, что изучения Haskell-я вместе с функциональным программированием потребует от вас большого количества практики и обучения.

Вспоминая дни, когда мы сами начинали изучать Haskell, может вас утешить, что веселье начнётся рано: очень увлекательно погружаться в язык, в котором многие общепринятые идеи либо в корне изменены, либо отсутствуют вообще, и при этом разбираться, как написать простейшие программы.

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

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

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

Чего ожидать от этой книги

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

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

* создание приложения, которое скачивает подкасты из Интернета и сохраняет их
  историю в SQL-базе данных,
* тестирование кода интуитивным и мощным способом: через описание свойств,
  которым должна соответствовать программа — тесты будут созданы автоматически
  библиотекой QuickCheck,
* расшифровка плохого зернистого снимка штрих-кода в идентификатор, который
  будет использован для запроса в библиотеку или книжный интернет-магазин,
* написание кода для веба, клиент-серверный обмен данными с приложениями на
  других языках в формате JSON, разработка многопоточного проверяльщика ссылок.

Немного о вас

Что нужно знать перед тем, как читать эту книгу? Мы ожидаем, что вы уже знакомы с программированием, но нет ничего страшного, если вы никогда не занимались функциональным программированием.

Не важно, какой у вас опыт, мы постарались предсказать ваши потребности: мы отступаем от основного повествования, чтобы подробнее объяснить потенциально сложные места, обычно с примерами и картинками.

Как новичок в Haskell-е вы неизбежно начнёте писать небольшие кусочки кода вручную для тех вещей, для которых можно было бы использовать готовые библиотечные функции или известные техники, если бы вы о них знали. Мы дополнили книгу информацией, которая позволит вам наверстать эти знания как можно скорее.

Конечно, как и на любом пути будут встречаться сложности.

Comments