pipelines

Monday, 1 February 2010 01:15
skiminok: (xkcd)
let (|>) x f = f x

Вот за это я все больше влюбляюсь в функциональщину вообще и в F# в частности.
Каких-то жалких 18 символов, а сколько пользы и удобства в итоге!
skiminok: (!int)
Скажите мне, где логика?
Почему в фееричном своим кретинизмом С++ (а точнее, в STL) две функции называются bind1st / bind2nd, но при этом с "привязкой" (binding) монад не имеют ничего общего, а представляют собою банальный оператор каррирования?
skiminok: (xkcd)
Рецепт успеха от Скима:

Откройте мой предыдущий пост.
Разместите данный и предыдущий посты рядом друг с другом (в этом весьма помогут двухпанельник, тайловый оконный менеджер, или просто система прилипания к краям, подобная Windows 7).
Читайте параллельно оба поста: код и его словесную интерпретацию.

...И попробуйте после этого сказать, что функциональные языки неудобочитаемы! =)

Под кат! )
skiminok: (xkcd)
Этим вечером я, будучи очень начинающим функциональщиком, чисто тренировки ради решил написать на F# эмулятор машины Тьюринга. Что интересно, получается это замечательно просто. Из всего сделал такие выводы:

1. Читабельность ФП-кода (как для непосвященного, так и для кодера) намного выше писабельности. Скорее всего потому что он выглядит почти как обыкновенная книга по математике на английском языке.
2. Когда пишешь ФП-код, периодически приходится сразу заботиться о производительности. Панацеей становится хвостовая рекурсия и хорошее владение функциональными структурами данных или методами, которые позволяют их эмулировать. Ил и забить на чистоту и юзать массивы :)
Но в моем случае я как честный человек писал тренировку, поэтому к массивам не прикасался, зато придумал для эмулятора удобный способ такой же сложности доступа к ячейке. В сущности, это сделало код еще более похожим на математическое определении конфигурации МТ.
3. Конкретно язык F# обладает одной занятной особенностью: он перенасыщен языковыми конструкциями для особых случаев. В отличие от любого другого ЯП, который я учил в своей жизни, здесь уже через несколько дней начинаешь путаться. Потом все потихоньку утрясается, конечно, но осадок остается.
4. Паттерн-матчинг — таки мощь :)

Код под катом, если кому интересно. Естественно, он не претендует на идеальность, автор разрешает пользоваться им в любых целях с указанием исходного авторства, дополнения в комментах приветствуются бла бла бла...

Исходный код )

(no subject)

Sunday, 3 January 2010 22:20
skiminok: (xkcd)
Лучшее занятие холодным зимним воскресеньем — это немного покормить одного не сильно толстого, но все же тролля :)
skiminok: (Compas)
У Скима за полнедели — три хороших новости.

1. Вышел третий номер журнала "Практика функционального программирования". Весь выпуск я пока не осилил, универ жрет время что твой Змей Горыныч, но последняя статья господина [livejournal.com profile] antilamer, описывающая доступным языком самые распространенные идиомы, практики и термины ФП, — не побоюсь этого слова, охуенна.

Ребятушки-козлятушки (да-да, вы, бездельники [livejournal.com profile] sofigenr, [livejournal.com profile] morozil_nik, [livejournal.com profile] rzhepish, ну а еще [livejournal.com profile] mg_mikes и [livejournal.com profile] happy_foxy, хотя вы тут какбе ни при чём, но последняя очень просила :)), я когда-нибудь смогу вам эту красотищу поведать али нет?

2. Мы с [livejournal.com profile] mag_ila сегодня наконец домучили яростно трепыхавшуюся машину Тьюринга для Floor Exp x. Получившийся монстр занимает 430 состояний и вычисляет экспоненту девятки примерно за 10^9 операций, на моем Intel Core 2 Quad на эмуляторе Loonies это длится около 15 секунд. Ни одна команда не была сгенерирована автоматически, полностью ручная, отборная работа, даже с графами (почти) каждой функции на А4. Жуткое зрелище.

3. Если повезет, то дружная инициативная команда все-таки доведет до ума популяризацию и предоставление всему ИПСА программы MSDN AA, на которую вуз давным-давно подписан, но об этом никто не знает :) Но особо здесь пока не распространяюсь, мало ли что. Рано.

Всем спасибо за поздравления, пожелания и комментарии =)
skiminok: (Default)
А еще я как-нибудь соберусь с силами и накропаю серию статей на тему "Катаморфизмы и ФП «для самых маленьких»". Как только аттестация закончится.

Ведь, как известно, самый лучший метод окончательно понять некий вопрос — объяснить его кому-нибудь другому. Тем более это офигенно повышает скилл преподавания и выступления на публике, что для будущей деятельности более чем полезно. Тем более если слушатели — товарищи [livejournal.com profile] sofigenr, [livejournal.com profile] morozil_nik и [livejournal.com profile] rzhepish. Можно и [livejournal.com profile] mg_mikes, но ей будет страшно =)

(no subject)

Saturday, 12 December 2009 22:20
skiminok: (Default)
http://lorgonblog.spaces.live.com
Много, много F#.
Особенно впечатляют 8 статей про тот самый пресловутый катаморфизм (вот начало). Вечерком в субботу — самое оно для мозга =)

P.S. [livejournal.com profile] sofigenr, рекомендую! ;-)
skiminok: (xkcd)

Сегодня друг-однопоточник попросил в общих чертах обрисовать ему, что такое функциональное программирование.

Я начал рассказывать в лучших традициях свидетелей Иеговы про декларативный стиль, неизменяемое состояние, функциональную чистоту, first-class functions, функции высшего порядка, алгебраические типы данных, обработку списков, паттерн-матчинг, систему вывода типов... примерно на середине рассказа парень отвлекся, забил и убежал в далекие степи.

Это странно, на самом-то деле. Почему все вокруг постоянно утверждают, что у меня офигенный талант преподавать интересные вещи, но при этом я совершенно не умею их рекламировать? Два года уже бьюсь над этим вопросом, еще с тех пор как впервые начал серьезно что-то рассказывать (тогда это был курс ООП молодому школьному поколению).

Возможно, все потому что я никогда не был особо силен ни в менеджменте, ни в экономике? Мей би. Осталось только разобраться, как эту ситуацию исправлять (не знания менеджмента, естественно, а навыки рекламы).

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

skiminok: (Compas)
За последнюю неделю ваш покорный слуга успел побывать на семинаре Тимошенко "Введение в специальность", на вводной встречей OSUM для ИПСА, на тусовке IT-JAM и, наконец, на очередном Microsoft Developer's Day, на этот раз посвященном PDC2009. Говоря по-хорошему, о каждом из этих ивентов стоило бы рассказать поподробнее, а принимая во внимание их масштаб и количество интересной информации, как минимум тройка интересных записей из этого дела и получилась бы.

Но, честно говоря, лишних двух часов на набивание в блог всех моих впечатлений от этих ивентов у меня пока что нету. Поэтому не обессудьте: будем ждать ближайшего приступа вдохновения :)

А пока этого поста в блоге не видится, Ским, продолжающий терзать глубины функционального программирования, отыскал на просторах Хабрахабра статью про катаморфизм в F#.

Черт возьми, это же так красиво. И действительно так просто:

let FoldTree treeF leafV tree =
    let rec loop tree cont =
        match tree with
        | Node (val, left, right) -> loop left (fun lacc ->
                           loop right (fun racc ->
                           cont (treeF val lacc racc)))
        | Leaf -> cont leafV
    loop tree (fun x -> x)
skiminok: (Compas)

Я год назад не интересовался и не просматривал видео с конференции PDC, поэтому только сейчас наткнулся на этот превосходный доклад:





По своей привычной традиции, процитирую самые замечательные шутки и фразы из речи докладчика )
skiminok: (Default)
Подзаголовок: fold! reduce! aggregate! accumulate!

sum = fold + 0
product = fold * 1
and = fold && true
or = fold || false
length = fold inc 0
reverse = fold (\x xs => xs ++ [x]) []
map = fold (\x xs => (f x):xs) []
filter = fold (\x xs => (p x)? (x:xs) : xs) []
skip = car fold (\x (ys, xs) => ((p x)? ys : (x:xs), x:xs) ([], [])


*Техники функционального программирования — красивейшая штука, оказывается... Чувствую, пройдет каких-нибудь полгода, и я буду мучить тут вас всех разными монадами и макросами. Пока что, кому интересно, может наблюдать за этим процессом: как медленно перерождается мозг императивного программиста =) Кому неинтересно — глубочайшее мое вам сорри.*

skiminok: (Skiminok)

"Если представление пар как процедур было для Вас еще недостаточно сумасшедшим, то заметьте, что в языке, который способен манипулировать процедурами, мы можем обойтись и без чисел (по крайней мере, пока речь идет о неотрицательных числах), определив 0 и операцию прибавления 1 так:

(define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))


Такое представление известно как числа Чёрча, по имени его изобретателя, Алонсо Чёрча, того самого логика, который придумал лямбда-исчисление."

Profile

skiminok: (Default)
skiminok

Most Popular Tags

July 2011

S M T W T F S
     12
3456789
10111213141516
17181920212223
242526272829 30
31      

Syndicate

RSS Atom