Бинарная сериализация в Haskell

Октябрь 6, 2009, 05:05

Для бинарной сериализации в Haskell существует модуль Data.Binary. Без побочных эффектов (де)сериализует в/из Data.ByteString.Lazy. Он пока не идет в поставке с GHC и его нужно руками ставить из hackage. Использовать его не просто, а очень просто:

(далее...)

Haskell в реальной жизни

Октябрь 5, 2007, 01:32

Итак! Этот долгожданный момент всё-таки наступил! Я получил свой первый опыт Haskell в коммерческом программировании!

Рассказываю как дело было:

(далее...)

Ханойские Башни

Август 10, 2007, 01:30

Давненько я ничего про Haskell не писал... Исправляюсь.

Задачу про Ханойские Башни (Towers of Hanoi) придумал французский математик Эдуард Люка в 1883 году. Существует легенда об индийском храме в котором есть большая комната с тремя алмазными столбиками на которые нанизано 64 золотых диска. И бог Брама повелел переложить диски с одного столбика на другой, и когда эта задача будет решена наш мир разрушится...

Условия головоломки: есть три столбика, на 1-й нанизана пирамида из n дисков (внизу самый большой диск, над ним чуть меньше и так далее), необходимо переместить эту пирамиду на 3-й столбик, перемещая по одному диску, при этом соблюдая условие что нельзя класть больший диск на меньший.

Это классическая задача на тему "рекурсия" и я думаю все кто хоть как-то связан с программированием её решали. Решается она очень просто:

(далее...)

Простые числа. Решето Эратосфена

Декабрь 13, 2006, 05:35

Это статья посвящена простым числам и эффективным способам их вычисления. Сразу скажу, что те алгоритмы, которые тут приведены, являются весьма и весьма нетривиальными и самому мне не давались довольно долго, но в итоге я их всё-таки придумал, написал и спешу поделиться со всеми вами. Исходные тексты в статье будут приведены на языках C# и Haskell.

Простое число – это натуральное число больше единицы, которое имеет ровно два делителя: единицу и само это число.

Решето Эратосфена – древний, но при этом весьма эффективный и до сих пор широко используемый алгоритм поиска всех простых чисел не превосходящих некоторого N.

Запишем подряд все числа от 2 до N. Дальше вычеркнем из этого списка все числа кратные 2, исключая саму двойку, потом вычеркнем все числа кратные 3, исключая само число 3, число 4 уже вычеркнуто, вычеркиваем числа кратные 5 и т.д. Продолжаем этот процесс, пока квадрат очередного числа не превысит N.

Самая простая программная реализация этого алгоритма выглядит следующим образом:

(далее...)

Функции как данные. Замыкание

Ноябрь 25, 2006, 01:21

Было это в самом-самом начале моего изучения функциональных языков. Читая SICP (русский перевод) я понял что такое замыкание :) . Попробую это описать. Замыкание контекста - способность лямбда функции сохранять контекст, в котором она была определена. Это свойство лямбда функций можно использовать для хранения данных, т.е. некоторые данные можно хранить в виде функций. Извлекать эти данные можно с помощью других функций. Попробуем разобраться (на примере хранение пары):

pair a b = \fnc -> fnc a b 
first p = p (\a b -> a)
second p = p (\a b -> b)

Итак, определяем пару как лямбда функцию от одного аргумента (этим аргументом впоследствии будет другая функция), этот аргумент применяется к членам пары. Функция получения первого члена пары будет функцией одного аргумента, которая будет применять этот аргумент к лямбда функции двух аргументов

\a b -> a 

Функция получения второго члена пары определяется аналогично.

Теперь мы можем определить пару

some_pair = pair 1 2 

И проверить как работают функции first и second

> first some_pair 
1
> second some_pair
2

Итак, много-много малопонятного текста на русском, и всего три простые строчки на Haskell’е :)

Записки начинающего функциональщика: восемь ферзей возвращаются

Январь 1, 2006, 23:31

Здравствуйте дорогие!

Во-первых, разрешите всех поздравить с наступившим Новым 2006 Годом! Счастья, удачи, успехов всем в новом году!

Во-вторых, разрешите напомнить, что настоящий Мастер использует все подворачивающиеся возможности для достижения полного и окончательного просветления :) . Вот и ваш покорный слуга, находясь в состоянии лёгкой постновогодней абстинентции родил следующее:

Это опять задача о расстановке ферзей, на сей раз занимаемся только подсчётом количества возможных расстановок:

(далее...)

Записки начинающего функциональщика: восемь ферзей

Декабрь 4, 2005, 19:57

Классическая формулировка этой задачи звучит так: найти все варианты расстановки ферзей на доске 8 на 8 таких, что ферзи не бьют друг друга. Обобщим её для доски N на N.

(далее...)

Записки начинающего функциональщика: простые числа

Декабрь 4, 2005, 17:32

Всё-таки функциональные языки – это совсем параллельная вселенная. И один из самых параллельных языков в ней – Haskell.

Захотелось нам ввести в программу бесконечный список простых чисел:

(далее...)
Сергей Лымарь © 2005-2011, Все права защищены. Сайт реализован на языке Haskell