November 2009 Archives

Вчора з друзями незадовго до півночі були біля Свічки Пам'яті, що в парку Слави. Там готувались до промови когось з керівництва, напевно Президента.

Я дивився на свічку і мені спало на думку, що з того Голоду мало зробити тільки висновок про злочинність, ба навіть глибоку хибність, того устрою, який в СРСР намагались видати за комунізм. Це суспільний, глобальний висновок.

Явище такого масштабу легко надає іще один, персональний, висновок: краще загинути від кулі, ніж від голоду.

Дивлячись на деякі приклади вирішення задач на ФМП, мені досі хочеться бігати кругами і кричати: "А-а-а-а-а, свобода!" Наприклад, в наступному рядку визначається функція, що робить з цілого числа список цифр:

let to_digits = let rec go l n = if n = 0 then l else go (n mod 10 :: l) (n / 10) in go []

P.S.: я такий емоційний!

... authors these days often introduce arcane methods that outperform the simpler techniques only when the problem size exceeds the number of protons in the universe.

Коли мені вперше попалось його "Мистецтво програмування", то я абсолютно не розумів з якою глибою зіткнувся. Книжка видавалась мені заскладною для повсякденного користування і я її користував кілька разів як довідник.

І тільки набагато піздніше я звів разом "Мистецтво програмування", орган вдома, tex.gif та літературне програмування, зрозумів, що це зробила ОДНА людина і прозрів.

Це людина, про яку складають легенди.

Я зазвичай музику гучно не вмикаю, але іноді пробиває.

Короче, не знаю, як там ви, а ми тут з сусідами саундтрек з "300" слухаємо. Зараз буде "Returns a King".

Я трохи переформатував ленту, додавши в неї фіди з Ліги, finance.ua та Економічної правди.

Одразу прийшло розуміння того, що треба виробити функцію оцінки новин, бо їх виходить забагато. Після деяких роздумів дійшов висновку, що для виведення такої функції мені спочатку треба окреслити власну споживацьку корзину (їжа, одяг, подорожі, діти, etc), підрахувати її вартість і надалі дивитись, наскільки ті чі інші новини можуть впливати на її вартість, мої доходи, резерви і, відповідно, мою спроможність цю "корзину" поповнювати.

А, ще треба задатись бажаною тривалістю власного життя для уточнення розрахунків :-)

Іду на torrents.ru качати повну збірку сонат Бетховена для скрипки.

Забираю торрент-файл, іду дивитись коментарі, а там рівно один запис: "Уже качаю" пише користувач з ніком КАСТЕТ.

Доставляє :-)

(Disclaimer: текст пишеться в першу чергу для того, щоби самому якнайповніше зрозуміти концепцію. Тому якщо для когось надто просто та банально або навпаки надто складно - вибачайте :-)

З прикладної точки зору, монади для функціонального програміста - такий самий design pattern, як для об'єктно-орієнтованого програміста адаптер чи абстрактна фабрика. Вони абсолютно необхідні для розв'язання реальних задач в тих функціональних мовах, які не підтримують поняття змінних та стану обчислень. OCaml в цьому розумінні не такий категоричний: mutable-поля в структурах є. Але чистий функціональний підхід має свої переваги, про які іншим разом.

Згідно з визначенням Філіпа Вадлера (він бородатий! :-) монада це:

Оператор M над типами разом з трійкою функцій


  • map

  • unit

  • join

Оператор над типами (в літературі - функтор) - це абстрактна функція , яка перетворює один тип в інший.

Мушу сказати, що цей момент мене трохи заплутував, коли я тільки перейшов з C++ на OCaml: в літературі по С++ функтором часто називають об'єкт будь-якого класу, для якого визначений operator(), в той час, коли насправді функтор в C++ це те, що виділено жирним в наступних рядках:

std::vector<std::string> vs;
std::list<std::pair<int, string> > lp;

В першому прикладі функтор створює тип вектор рядків з типу рядок. В другому - два функтори вкладені одне в одного: внутрішній функтор з двох простих типів створює тип пара, а зовнішній - з цього типу пара створює тип список пар.

Функція map перетворює значення одного "монадного" типу в значення іншого "монадного" типу. Наприклад, нехай в нас в якості оператора M виступає той самий std::vector. Також в нас є функція, яка перетворює значення цілого в пару: 1 -> (1,"один"), 2 -> (2,"два"), і т.д. Тоді map, прийнявши в якості параметра таку функцію, зможе перетворити для нас вектор цілих у вектор пар; значення одного "монадного" типу у значення іншого. Як на мене - круто :-)

В реальному світі монадою часто називають конкретне значення "монадного" типу, що було отримане в результаті застосування функції unit до значення деякого вихідного, "немонадного", типу. На OCaml це може виглядати так:

# let unit x = [x] ;;
val unit : 'a -> 'a list = <fun>
# let a = unit 5 ;;
val a : int list = [5]
# let b = 1 :: unit 10 ;;
val b : int list = [1; 10]
# let c = "a" :: unit "test" ;;
val c : string list = ["a"; "test"]

Така функція візьме на вхід будь-що і зробить з цього "будь-що" список з одного елемента.

Функція join потрібна для компенсації ефектів, що виникають при композиції кваліфікаторів, в результаті чого вихідний тип x виявляється "загорнутим" в монаду двічі.

Продовження, безумовно, буде...

Останнім часом в ленті надто багато повідомлень пов'язаних з Росією. При чому про неї не тільки пишуть самі росіяни, а й наші. Та ще й друзі дофіга шарять російських новин та постів, пов'язаних з внутрішньоросійськими ситуаціями.

На тлі цього потоку наша домашня ситуація якось втрачається і видається абсолютно незначущою.

Не розумію.

Можна багато говорити про значення цього дня в історії. Про людей, які зробили цей день. Але я скажу про те, що він значить особисто для мене:

З Днем Народження, брате. Всього тобі найкращого!

Щось мені не дається концепція монад. В теорії, ніби, ясно: треба ввести тип, який покриває всі можливі типи завершення роботи функції. Але мені не вистачає живих прикладів.

Ми розбили термометр. Ртутний. В кухні на кафелі. Я подзвонив в МЧС по номеру 101. Там мені дали номер 044-430-50-10. На цьому номері мене перенаправили на номер 044-430-37-13.

На останньому номері трубу взяв чоловік і нарешті розказав, що саме треба робити. Короче, коли розбиваєш щось із ртуттю або розливаєш саму ртуть треба робити наступне:


  1. Відкрити вікна та зачинити двері в приміщенні, де розлилась ртуть.

  2. Вологою ганчіркою зібрати ртуть з країв до епіцентру. Якщо по дорозі є тріщини в підлозі - застосувати кисточку. Ми користувались туалетним папером, змоченим в марганцовку.

  3. Зібрати ртуть разом з усіма предметами, що були задіяні в зборі, в скляну банку з герметичною кришкою. Банку тримати в холодному темному місці.

  4. Протерти підлогу сильним розчином "Білизни" чи якоїсь аналогічної речовини з хлором. Тхнути хлором має пару годин.

Одні вважають, що гроші - це абсолютне зло. Другі, що це міра вартості товару або послуги при купівлі-продажу. Треті - що спроба розібратись в тому, що таке гроші робить людей дурнями.

Маячня.

В тій реальності, в якій ми з вами живемо, гроші - це еквівалент енергії. Нагадаю, що у фізиці енергія - це здатність тіла виконувати роботу. Тобто гроші - це міра можливостей суб'єкта, якому ці гроші належать. Ступінь ефемерності нашої реальності - тема дуже довгої окремої розмови. У свою чергу, з концепції "гроші-енергія" випливає дуже багато інших цікавих концепцій типу ефективності, потужності та корисності.

Енергія зазвичай накопичується в тих суб'єктів, що свідомо чи несвідомо поводять себе у найкращій відповідності до законів середовища, в якому існують. Так само і з грошима. Як хороший мисливець, що добре знає поведінку здобичі, завжди ситий і готовий до наступного полювання, так і хороший інженер чи підприємець, який може дати те, що потрібно ринку - завжди з грошима і готовий до наступних проектів.

Коли грошей мало, рівень енергії занизький, то і можливості невеликі. Дай Бог, щоби вистачало на їжу, одяг та житло. Але коли грошей багато, то з'являється проблема вибору. Різноманітність нашої реальності надає можливість застосувати накопичену енергію безліччю різних шляхів. Один з них - за допомогою накопиченого накопичувати далі. Всі інші - широченний спектр від корисних (для суб'єкта чи середовища) до маніакально-деструктивних.

В будь-якому разі, вибір шляху використання енергії - привілей власника.

Сторінки

Про цей Архів

This page is an archive of entries from November 2009 listed from newest to oldest.

October 2009 is the previous archive.

December 2009 is the next archive.

Свіжі записи можна подивитись на головній сторінці. Все інше - в архіві.