Hastache — реализация Mustache для Haskell
Довел до ума и выложил в open source свою реализация шаблонизатора Mustache, на которой, в частности, крутится сайт с которого вы это сейчас читаете.
Взять можно либо на GitHub, либо из HackageDB:
Бинарная сериализация в Haskell: использование библиотеки derive
В рамках борьбы с велосипедизмом, я просто обязан написать про библиотеку derive. Служит она для автоматической генерации инстансов разных классов (смотрите документацию каких именно, там много). Меня эта библиотека заинтересовала, прежде всего, как генератор для Data.Binary, которая очень удобна как быстрый бинарный сериализатор над Data.ByteString.Lazy. У себя на сайте я использую Data.Binary для кеширования данных. Derive умеет генерировать как обычный код внутри .hs файлов, так и создавать инстансы во время компиляции с помощью Template Haskell.
Новый движок моего блога (на Haskell)
Переписал свой блог — теперь это Haskell! Заходите вы ко мне на сайт, почитать это сообщение, а в это время, на далеком сервере, лямбда функции замыкаются и редуцируются, монады одна в другую трансформируются, санки форсятся и происходит разная другая магия.
Пока немного тезисно что, как и почему, часть тем буду в будущем разворачивать:
Бинарная сериализация в Haskell
Для бинарной сериализации в Haskell существует модуль Data.Binary. Без побочных эффектов (де)сериализует в/из Data.ByteString.Lazy. Он пока не идет в поставке с GHC и его нужно руками ставить из hackage. Использовать его не просто, а очень просто:
Haskell в реальной жизни
Итак! Этот долгожданный момент всё-таки наступил! Я получил свой первый опыт Haskell в коммерческом программировании!
Рассказываю как дело было:
Ханойские Башни
Давненько я ничего про Haskell не писал... Исправляюсь.
Задачу про Ханойские Башни (Towers of Hanoi) придумал французский математик Эдуард Люка в 1883 году. Существует легенда об индийском храме в котором есть большая комната с тремя алмазными столбиками на которые нанизано 64 золотых диска. И бог Брама повелел переложить диски с одного столбика на другой, и когда эта задача будет решена наш мир разрушится...
Условия головоломки: есть три столбика, на 1-й нанизана пирамида из n дисков (внизу самый большой диск, над ним чуть меньше и так далее), необходимо переместить эту пирамиду на 3-й столбик, перемещая по одному диску, при этом соблюдая условие что нельзя класть больший диск на меньший.
Это классическая задача на тему "рекурсия" и я думаю все кто хоть как-то связан с программированием её решали. Решается она очень просто:
Простые числа. Решето Эратосфена
Это статья посвящена простым числам и эффективным способам их вычисления. Сразу скажу, что те алгоритмы, которые тут приведены, являются весьма и весьма нетривиальными и самому мне не давались довольно долго, но в итоге я их всё-таки придумал, написал и спешу поделиться со всеми вами. Исходные тексты в статье будут приведены на языках C# и Haskell.
Простое число – это натуральное число больше единицы, которое имеет ровно два делителя: единицу и само это число.
Решето Эратосфена – древний, но при этом весьма эффективный и до сих пор широко используемый алгоритм поиска всех простых чисел не превосходящих некоторого N.
Запишем подряд все числа от 2 до N. Дальше вычеркнем из этого списка все числа кратные 2, исключая саму двойку, потом вычеркнем все числа кратные 3, исключая само число 3, число 4 уже вычеркнуто, вычеркиваем числа кратные 5 и т.д. Продолжаем этот процесс, пока квадрат очередного числа не превысит N.
Самая простая программная реализация этого алгоритма выглядит следующим образом:
Функции как данные. Замыкание
Было это в самом-самом начале моего изучения функциональных языков. Читая SICP (русский перевод) я понял что такое замыкание :) . Попробую это описать. Замыкание контекста - способность лямбда функции сохранять контекст, в котором она была определена. Это свойство лямбда функций можно использовать для хранения данных, т.е. некоторые данные можно хранить в виде функций. Извлекать эти данные можно с помощью других функций. Попробуем разобраться (на примере хранение пары):
|
|
Итак, определяем пару как лямбда функцию от одного аргумента (этим аргументом впоследствии будет другая функция), этот аргумент применяется к членам пары. Функция получения первого члена пары будет функцией одного аргумента, которая будет применять этот аргумент к лямбда функции двух аргументов
|
|
Функция получения второго члена пары определяется аналогично.
Теперь мы можем определить пару
|
|
И проверить как работают функции first и second
|
|
Итак, много-много малопонятного текста на русском, и всего три простые строчки на Haskell’е :)