Hastache — реализация Mustache для Haskell

Март 28, 2011, 07:00

До­вел до ума и вы­ло­жил в open source свою ре­а­ли­за­ция шаб­ло­ни­за­то­ра Mus­tache, на ко­то­рой, в част­но­сти, кру­тит­ся сайт с ко­то­ро­го вы это сей­час чи­та­е­те.

Взять мож­но либо на GitHub, либо из Hack­ageDB:

(далее...)

Бинарная сериализация в Haskell: использование библиотеки derive

Март 04, 2011, 19:50

В рам­ках борь­бы с ве­ло­си­пе­диз­мом, я про­сто обя­зан на­пи­сать про биб­лио­те­ку de­rive. Слу­жит она для ав­то­ма­ти­че­ской ге­не­ра­ции ин­стан­сов раз­ных клас­сов (смот­ри­те до­ку­мен­та­цию ка­ких имен­но, там мно­го). Меня эта биб­лио­те­ка за­ин­те­ре­со­ва­ла, пре­жде все­го, как ге­не­ра­тор для Data.Bi­na­ry, ко­то­рая очень удоб­на как быст­рый би­нар­ный се­ри­а­ли­за­тор над Data.ByteString.Lazy. У себя на сай­те я ис­поль­зую Data.Bi­na­ry для ке­ши­ро­ва­ния дан­ных. De­rive уме­ет ге­не­ри­ро­вать как обыч­ный код внут­ри .hs фай­лов, так и со­зда­вать ин­стан­сы во вре­мя ком­пи­ля­ции с по­мо­щью Tem­plate Haskell.

(далее...)

Новый движок моего блога (на Haskell)

Февраль 28, 2011, 16:03

Пе­ре­пи­сал свой блог — те­перь это Haskell! За­хо­ди­те вы ко мне на сайт, по­чи­тать это со­об­ще­ние, а в это вре­мя, на да­ле­ком сер­ве­ре, лямб­да функ­ции за­мы­ка­ют­ся и ре­ду­ци­ру­ют­ся, мо­на­ды одна в дру­гую транс­фор­ми­ру­ют­ся, сан­ки фор­сят­ся и про­ис­хо­дит раз­ная дру­гая ма­гия.

Пока немно­го те­зис­но что, как и по­че­му, часть тем буду в бу­ду­щем раз­во­ра­чи­вать:

(далее...)

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

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

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

(далее...)

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

Октябрь 05, 2007, 02:32

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

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

(далее...)

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

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

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

За­да­чу про Ха­ной­ские Баш­ни (Tow­ers 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 и sec­ond

> first some_pair
1
> second some_pair
2

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

Сергей Лымарь © 2005-2014, Все права защищены.