Величайший ЯП современности
Thursday, 21 January 2010 22:29Почему в фееричном своим кретинизмом С++ (а точнее, в STL) две функции называются bind1st / bind2nd, но при этом с "привязкой" (binding) монад не имеют ничего общего, а представляют собою банальный оператор каррирования?
Специально для воинствующих императивщиков
Friday, 15 January 2010 19:39Откройте мой предыдущий пост.
Разместите данный и предыдущий посты рядом друг с другом (в этом весьма помогут двухпанельник, тайловый оконный менеджер, или просто система прилипания к краям, подобная Windows 7).
Читайте параллельно оба поста: код и его словесную интерпретацию.
...И попробуйте после этого сказать, что функциональные языки неудобочитаемы! =)
( Под кат! )
1. Читабельность ФП-кода (как для непосвященного, так и для кодера) намного выше писабельности. Скорее всего потому что он выглядит почти как обыкновенная книга по математике на английском языке.
2. Когда пишешь ФП-код, периодически приходится сразу заботиться о производительности. Панацеей становится хвостовая рекурсия и хорошее владение функциональными структурами данных или методами, которые позволяют их эмулировать. Ил и забить на чистоту и юзать массивы :)
Но в моем случае я как честный человек писал тренировку, поэтому к массивам не прикасался, зато придумал для эмулятора удобный способ такой же сложности доступа к ячейке. В сущности, это сделало код еще более похожим на математическое определении конфигурации МТ.
3. Конкретно язык F# обладает одной занятной особенностью: он перенасыщен языковыми конструкциями для особых случаев. В отличие от любого другого ЯП, который я учил в своей жизни, здесь уже через несколько дней начинаешь путаться. Потом все потихоньку утрясается, конечно, но осадок остается.
4. Паттерн-матчинг — таки мощь :)
Код под катом, если кому интересно. Естественно, он не претендует на идеальность, автор разрешает пользоваться им в любых целях с указанием исходного авторства, дополнения в комментах приветствуются бла бла бла...
( Исходный код )
(no subject)
Sunday, 3 January 2010 22:20Хроники последних дней
Monday, 21 December 2009 23:121. Вышел третий номер журнала "Практика функционального программирования". Весь выпуск я пока не осилил, универ жрет время что твой Змей Горыныч, но последняя статья господина
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Ребятушки-козлятушки (да-да, вы, бездельники
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
2. Мы с
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
3. Если повезет, то дружная инициативная команда все-таки доведет до ума популяризацию и предоставление всему ИПСА программы MSDN AA, на которую вуз давным-давно подписан, но об этом никто не знает :) Но особо здесь пока не распространяюсь, мало ли что. Рано.
Всем спасибо за поздравления, пожелания и комментарии =)
Для самых маленьких
Wednesday, 16 December 2009 19:03Ведь, как известно, самый лучший метод окончательно понять некий вопрос — объяснить его кому-нибудь другому. Тем более это офигенно повышает скилл преподавания и выступления на публике, что для будущей деятельности более чем полезно. Тем более если слушатели — товарищи
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
(no subject)
Saturday, 12 December 2009 22:20Много, много F#.
Особенно впечатляют 8 статей про тот самый пресловутый катаморфизм (вот начало). Вечерком в субботу — самое оно для мозга =)
P.S.
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Сегодня друг-однопоточник попросил в общих чертах обрисовать ему, что такое функциональное программирование.
Я начал рассказывать в лучших традициях свидетелей Иеговы про декларативный стиль, неизменяемое состояние, функциональную чистоту, first-class functions, функции высшего порядка, алгебраические типы данных, обработку списков, паттерн-матчинг, систему вывода типов... примерно на середине рассказа парень отвлекся, забил и убежал в далекие степи.
Это странно, на самом-то деле. Почему все вокруг постоянно утверждают, что у меня офигенный талант преподавать интересные вещи, но при этом я совершенно не умею их рекламировать? Два года уже бьюсь над этим вопросом, еще с тех пор как впервые начал серьезно что-то рассказывать (тогда это был курс ООП молодому школьному поколению).
Возможно, все потому что я никогда не был особо силен ни в менеджменте, ни в экономике? Мей би. Осталось только разобраться, как эту ситуацию исправлять (не знания менеджмента, естественно, а навыки рекламы).
*Существует еще мизерная вероятность того, что сам по себе вопрос функционального программирования настолько нуден и бесполезен, что захватывающе его пропиарить в принципе невозможно. Но я почему-то в такой исход событий не верю :) *
О неделе конференций и сливках катаморфизма
Thursday, 10 December 2009 00:14Но, честно говоря, лишних двух часов на набивание в блог всех моих впечатлений от этих ивентов у меня пока что нету. Поэтому не обессудьте: будем ждать ближайшего приступа вдохновения :)
А пока этого поста в блоге не видится, Ским, продолжающий терзать глубины функционального программирования, отыскал на просторах Хабрахабра статью про катаморфизм в F#.
Черт возьми, это же так красиво. И действительно так просто:
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)
PDC2008: An Introduction to Microsoft F#
Thursday, 12 November 2009 19:50Я год назад не интересовался и не просматривал видео с конференции PDC, поэтому только сейчас наткнулся на этот превосходный доклад:

( По своей привычной традиции, процитирую самые замечательные шутки и фразы из речи докладчика )
SICP и ФП. Хроники мозга. Вырезка #1
Wednesday, 11 November 2009 18:42sum = 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) ([], [])
*Техники функционального программирования — красивейшая штука, оказывается... Чувствую, пройдет каких-нибудь полгода, и я буду мучить тут вас всех разными монадами и макросами. Пока что, кому интересно, может наблюдать за этим процессом: как медленно перерождается мозг императивного программиста =) Кому неинтересно — глубочайшее мое вам сорри.*
SICP. Хроники мозга. Вырезка #0
Sunday, 8 November 2009 01:38"Если представление пар как процедур было для Вас еще недостаточно сумасшедшим, то заметьте, что в языке, который способен манипулировать процедурами, мы можем обойтись и без чисел (по крайней мере, пока речь идет о неотрицательных числах), определив 0 и операцию прибавления 1 так:
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
Такое представление известно как числа Чёрча, по имени его изобретателя, Алонсо Чёрча, того самого логика, который придумал лямбда-исчисление."