Мы с вами уже перестали бояться монад, но всякие непонятные стрелочки в коде типа <>, <$>, <*> и <|> по-прежнему повергают нас в ужас. Сегодня мы выясним, что и здесь бояться особо нечего. Как и в случае с монадами, здесь имеют место быть обыкновенные классы типов и функции для работы с ними. Все просто.

В 99% случаев если вам требуется компилятор Haskell, то Haskell Platform решит все ваши проблемы. В платформу входит не только непосредственно стабильная версия компилятора GHC, но и такие утилиты, как cabal и haddock, а также некоторые часто используемые библиотеки. При этом с помощью cabal можно обновить, пожалуй, всю платформу, не считая разве что самого GHC. Но иногда хочется поиграться с версией GHC посвежее. Вот тому, как это сделать, и посвящена сия заметка.

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

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

Дело было вечером, делать было нечего, и я пошел гулять по интернетам в поисках существующих встраиваемых (embedded) баз данных для Erlang. Вот, скажем, есть у нас приложенька, которая работает с небольшими (десяток-другой гигабайт) объемами не саммых ценных в системе данных. Ну не поднимать же Riak кластер только ради этой приложеньки и не таскать же за ней повсюду PostgreSQL? В общем, посмотрел я на существующие решения (DETS, Mnesia, Bitcask, LevelDB, SQLite, Innostore, HanoiDB) и пошел классно писать очередной ненужный KV-велосипед.

Примем за рабочую теорию, что мы здесь все взрослые и осознаем важность использования менеджера пакетов. Есть много способов упаковать приложение, написанное на Erlang, в deb, rpm или еще какого формата пакет. Здесь я опишу один из множества таких способов, основанный на использовании утилиты FPM.

Предыстория. Некоторое время назад в комментариях к заметке Работа с нитями/потоками в Haskell Роман совершенно справедливо заметил, что задачу перебора хэшей было бы куда правильнее решать, используя, например, пакет parallel. Перебор хэшей был выбран мной, как универсальная задача, с помощью которой можно продемонстрировать работу и с MVars, и с транзакционной памятью, и с монадами Par/Eval. Чтобы не приходилось придумывать новую задачу для каждого нового поста.

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

Ранее мы выяснили, как на Haskell работать с базами данных, писать REST API, генерировать и читать JSON-стримы, работать с конфигами и писать логи. Для полного счастья осталось разве что научится ходить в Graphite. После этого можно спокойно протаскивать Haskell в продакшн, пописывая на нем небольшие RESTful сервисы. Так чего же мы ждем?

Помните, мы когда-то писали телефонную книгу на Haskell и прикручивали к ней веб-интерфейс? У этой телефонной книги есть существенный недостаток. Дело в том, что соединение с базой данных устанавливается только один раз, при запуске приложения. Если во время работы программы соединение порвется, для его восстановления телефонную книгу придется перезапустить. Кроме того, наличие всего лишь одного соединения делает параллельную обработку нескольких запросов в лучшем случае невозможным, а в худшем — чреватой ошибками. Сегодня мы этот ужасный недостаток устраним!