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

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

    Вы, конечно, играли в текстовую приключенческую игру 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 — Зал
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 14
    • +1
      Я постараюсь объяснять все используемые концепции так детально, как будто рассказываю это тем, кто ничего не знает о Haskell, — или даже о программировании.

      Это вы замахнулись =) Но почитать статьи будет интересно.
      • +1
        Надеюсь на то. Я, кстати, не один на такое замахивался. Тут уже кое-кто хотел написать Туториал (году в 2009), да так и не взялся. Обещал сделать чат…

        Посмотрим, что получится.
      • +1
        До боли смахивает на lisperati.com/haskell/, ну не суть. Современные текстовые квесты (жанр Interactive Fiction, который и появился из трилогии Zork, а точнее из предшественника Zork — игры Adventure) пишут на языке Inform, так может проще интерпретатор или, наоборот, конвертор Inform сделать?
        • +1
          Пардон, первый линк спутал с лисповым landoflisp.com.
            • 0
              Да, я видел этот сайт. advgame — это оно и есть, только на Haskell. А adv2game — это, собственно, продвинутая версия advgame… ну, только о другом. Мне все же кажется, что Casting Spells — слишком узкая задача.
          • +1
            «Его достоинства неумолимы» — друг Аркадий, не говори красиво! ©
            • +1
              только сегодня подумал взяться за haskell, а тут вы. Надеюсь проект не заглохнет, очень интересно будет почитать.
            • +2
              хм… Из начала статьи казалось, что это вот ща уже статья… а тут мегаанонс только. Как-то обломненько. Придётся продолжения ждать, а пока губу обратно закатывать…

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