extends: default.liquid lang: ru date: 12 Dec 2012 00:00:00 +0300 title: Зачем нужно функциональное программирование? Зачем нужен Haskell? tags: переводы, realworldhaskell source: http://book.realworldhaskell.org/read/why-functional-programming-why-haskell.html comments: true
Недавно я решил всё-таки доучить 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-е вы неизбежно начнёте писать небольшие кусочки кода вручную для тех вещей, для которых можно было бы использовать готовые библиотечные функции или известные техники, если бы вы о них знали. Мы дополнили книгу информацией, которая позволит вам наверстать эти знания как можно скорее.
Конечно, как и на любом пути будут встречаться сложности.