Pull to refresh

Haskell Quest Tutorial — Приветствие

Reading time4 min
Views11K
Добрый день, любители приключений!

Вы, конечно, играли в текстовую приключенческую игру Zork. Вы еще помните эти недели, когда вы искали вход в подземелье, или думали, как пройти мимо гоблинов с дубинками. Вы помните, как махали мечом, вы даже испробовали различные варианты «hit self» и «kill self». Программа понимала ваши команды, — результат был предсказуем… Весело и удивительно было изучать текстовый мир Zork! И вам, конечно, хотелось создать что-то подобное своими руками. Так может, попробуем? Вместе? В этом руководстве вы будете шаг за шагом создавать свою текстовую игру на замечательном языке Haskell.

Я постараюсь объяснять все используемые концепции так детально, как будто рассказываю это тем, кто ничего не знает о Haskell, — или даже о программировании. Это, быть может, не всегда получится, поскольку руководство пишется параллельно с кодом, для изучения языка. Я готов ответить на все ваши вопросы, если смогу. Искушенные хаскеллисты могут посчитать ответы, объяснения и программный код где-то корявыми или не полностью верными. Это ничего: чем дальше в лес, — тем злее волки тем богаче флора и фауна. У нас есть кусок глины, — и скоро он станет чем-нибудь оформленным, вазой, например. Я не могу заранее сказать, сколько будет статей, как они будут выглядеть, и к чему мы придем. «Знать путь и пройти его — не одно и то же».

Почему Haskell, а не F#, OCaml, Erlang, Lisp...? Haskell из них — темная лошадка. Судите сами. Lisp — очень древний и очень мощный мультипарадигменный язык. Один из самых лучших, один из самых высокоуровневых. Он давно занял свою нишу, подарил искусству программирования множество идей. Но неопытный глаз видит в коде Lisp'а сплошные скобочки. К Lisp-подобным языкам нелегко привыкнуть, это отняло бы у нас время. F#? Ну, я не хочу привлекать .NET, — из чисто идеологических соображений. Erlang, субъективно, кажется тяжеловесом, предназначенным для других целей. Его достоинства неумалимы, но к чему они нам в такой конкретной задаче, как создание квеста? Пожалуй, с Haskell мог бы поспорить только OCaml — как близкий родственник со схожим синтаксисом и сравнимой выразительностью. Только мне видится, что Haskell, который создавался как лучший функциональный язык, может утереть ему нос, — не сейчас, так в будущем. По крайней мере, на это можно надеяться, наблюдая его кривую жизни: сейчас она поднимается резко вверх. Можно найти много других причин; хотя на самом-то деле не важно, почему именно Haskell. Я знаю одно: писать на нем — большое удовольствие, и тем приятнее, что осознаешь: именно Haskell — острие программистской науки.

Конечно, на практике Haskell проигрывает и Erlang, и Lisp, и даже — F#, последний из которых, судя по всему, нацелился покорить многих прикладных программистов на .NET. Саймон Пейтон Джонс, один из создателей языка Haskell, даже придумал неофициальный девиз: «избегать популярности любой ценой». Будем надеяться, что серия этих статей не слишком его разочарует. Есть вероятность, что кто-то, начитавшись о Haskell, начнет его изучать, — а поняв его философию, попробует где-нибудь применить. Пока я писал маленькие пробные программки, заразился идеей сделать на нем парсер и мержер трафика с телефонных станций (я работаю в телекомах), — уж очень привлекала возможность написать функциональный парсинг, потратив минимум усилий, — не то что на Си. Я реализовал эту идею. Программа получилась не идеальная, при пиковой нагрузке требует много памяти, — но значительное ее преимущество в том, что имея работающий прототип, я могу улучшать его и быстро адаптировать под новые условия. Код на Haskell легко переделывать, а этой головной боли с мучительной отладкой уже и нет. И хотя это заслуга не столько языка, сколько всего функционального программирования, я склонен ассоциировать с ФП именно Haskell, а не что-либо другое.

Кстати о практике. Видели бы вы, как красиво подсвечивается Haskell-синтаксис в GeSHi! Ну вот пример:



Ведь правда же, изумительная подсветка? К сожалению, Habrahabr не поддерживает никакие продвинутые теги, а только «font». И что же делать? Перелопачивать результат, заменяя всё на «font»? Умучаешься. Или залезть во внутренности GeSHi? Но я не люблю php! Ни то, ни другое мне было не по нраву, так что я просто за вечер написал парсер-форматтер на Haskell. И, какжется, он хорошо работает. Несмотря на несовершенство. Благодаря этому вы увидите код в моих статьях почти так же хорошо подсвеченный, как это делает GeSHi.

Проект моего квеста называется Adv2Game (Advanced Adventure Game). Вы найдете исходники на странице проекта (git). А сопровождающий код для руководства я буду выкладывать здесь (git). Название «Adv2Game» я выбрал неслучайно. Дело в том, что в Haskell-репозитории Hackage есть простенький квест advgame, — я заимствовал некоторые идеи оттуда и по-своему их обыграл. Сейчас мой квест очень далек от завершения, да и не ручаюсь, что он будет завершен когда-либо. Это, конечно, нехорошо — оставлять проекты незавершенными. Я надеюсь все же, что мои статьи будут ненапрасными, и кто-то благодаря им доведет свой проект на Haskell до конца.

Литература для изучения по Haskell разнообразна, но, к сожалению, в основном на английском языке.
Самые-самые лучшие англоязычные источники:
1. «Learn You a Haskell for Great Good!» (сайт, zip-архив mht-файлов по главам).
2. «Real World Haskell» (сайт, zip-архив mht-файлов по главам).
3. HaskellWiki (в том числе и список всяческих руководств).
4. Haskell Planet.
Русскоязычные материалы:
1. Частичный перевод «Learn You a Haskell for Great Good!» в этом блоге хорошими людьми. ([1], [2], [3], [4]).
2. Журнал «Практика функционального программирования» — во истину замечательный труд!
3. Блоги умных людей, пишущих на Haskell: _adept_, thesz, Alex Ott, yantayga.

Ну что, на поиски приключений?..

Содержание:
Приветствие
Часть 1 — Преддверие
Часть 2 — Лес
Часть 3 — Поляна
Часть 4 — Вид каньона
Часть 5 — Зал
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+18
Comments14

Articles