madf: (Default)
Спочатку Bartosz Milewski: „C++17: I See a Monad in Your Future!“.
Потім Ivan Čukić: Meeting C++ with Monads, Berlin“.
Сьогодні Joaquín Mª López Muñoz: „Monads in C++14“.
madf: (Default)
C++ Ranges are Pure Monadic Goodness
Bartosz як завжди прекрасний. Якщо у 17-й стандарт додадуть ranges від Eric Niebler то з C++ уже можна буде жити у сучасному світі. А то там всякі додають optional без fmap з семантикою вказівників і думають що несуть світло й добро...
madf: (Default)
Що б там не казав Bjarne Stroustrup шановному [livejournal.com profile] ivan_gandhi, Bartosz Milewski з оптимізмом дивиться у майбутнє: http://bartoszmilewski.com/2014/02/26/c17-i-see-a-monad-in-your-future/
Добро перемагає!
madf: (Default)
BoostCon-2010:
Functional Programming in C++ (on chalkboard) by David Sankel
Functional Programming in C++ by David Sankel

C++Now!-2013 (свіжачок, конфа ще йде — сьогодні останній день!):
The Intellectual Ascent to Agda by David Sankel

Перші дві презентації спираються на C++03, так що деякі речі зараз можна виразити значно простіше. У останній презентації наводиться приклад коли дизайн розробляється у агдочці а потім на його базі пишеться код на C++. Якщо не помиляюсь, [livejournal.com profile] zamotivator колись писав про те що дизайнив шаблонні метапрограми у Scheme (чи іншому ліспі) а потім кодував на плюсах.
madf: (Default)
Bartosz Milewski підняв цікаву тему: як функтори, аплікативні функтори і монади допомагають боротися з інверсією управління при використанні асинхронного API (в контексті C++).
Відео: „Вступ і про функтори“, „Аплікативні функтори“, „Монади“.
Слайди: https://www.fpcomplete.com/wp-content/uploads/2012/09/Functional-Patterns.pdf
Read more... )
madf: (Default)
Прекрасне відео про нутрощі XMonad:

Продовження: http://www.youtube.com/watch?v=ivdyLaH3PhY&list=PLxj9UAX4Em-IBXkvcC3MycLlcxyoi7v8B&index=4
В основному мова йде про StackSet, структуру даних що керує вікнами і workspace'ами, і про Zipper. Показано принципи зневадження на реальному прикладі. Про Zipper зовсім трохи, поверхнево. Про нього краще почитати у Дона Стюарта (один із співавторів Real World Haskell і XMonad): https://donsbot.wordpress.com/2007/05/17/roll-your-own-window-manager-tracking-focus-with-a-zipper/
Там же є посилання на оригінальну працю Gerard’а Huet’а, який і придумав Zipper.
А у джерельних кодах XMonad можна знайти цитату самого Олега:
--    A Zipper is essentially an `updateable' and yet pure functional           
--    cursor into a data structure. Zipper is also a delimited                  
--    continuation reified as a data structure.                                 
--                                                                              
--    The Zipper lets us replace an item deep in a complex data                 
--    structure, e.g., a tree or a term, without an  mutation.  The             
--    resulting data structure will share as much of its components with        
--    the old structure as possible.                                            
--                                                                              
--      Oleg Kiselyov, 27 Apr 2005, haskell\@, "Zipper as a delimited continuation"
madf: (Default)
Є одна кльова софтинка, яку я давно використовую. Але мене задовбували у ній два дуже неприємних баги: хтозна-чого вона жерла CPU як не в себе, і її вікно іноді ховалось під інші вікна (хоча завжди повинне бути on top).

Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.

Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
Якщо вам не страшний код на Haskell можете зазирнути під кат )

C++, Maybe

Dec. 23rd, 2012 08:46 pm
madf: (Default)
Колись, якщо я не помиляюсь, [livejournal.com profile] ivan_gandhi писав що методи get це зло. На жаль, я того посту знайти не можу. Пам’ятаю тільки що у коментарях хтось як альтернативу запропонував методи with. Я тоді не звернув увагу.
Не знаю, не знаю... )
madf: (Default)

Зацікавитись проблемою partial application у C++ мене заставила оказія на роботі і оця стаття на хабрі: "Частичное применение и каррирование в C++". Ну про статтю говорити багато не буду — візьміть та прочитайте. Скажу тільки що автор використовує новий стандарт лише частково, у рамках підтримки його Microsoft Visual Studio 2010. Не використовує навіть variadic templates. На робочій оказії ж зупинюсь детальніше.


В рамках впровадження на роботі Boost.Signal2 замість дерев’яного велосипеду на паровій тязі я стикнувся з проблемою втикання методів класів у слот. Проблема стара як світ і полягає у наявності неявномого параметра this який треба передати явно. Всі, мабуть, знають що методи класів у плюсах це, насправді, звичайнісінькі функції яким неявно першим параметром передається вказівник на об’єкт якому вони належать. Невільні функції, страждають на панщині, що тут поробиш. Якщо мислити на рівні старого-доброго C чи мови ассемблера (від якої він не далеко відкотився) — все в порядку. Втикаємо вказівник на об’єкт (чи, пардон, на структуру) у перший параметр (чи кладемо його у стек, чи записуємо у регістр) і ніяких проблем. Та у плюсах все не так. Не проста у нас функція.


Картинок не буде )
madf: (Default)

А я підбивав колегу з’їздити на Kiev::fprog, та так і не зібрались.
madf: (Default)
Або сортування типів.
Read more... )
А от нафіга все це мені потрібно - розкажу пізніше.
madf: (Default)
На роботі дістали проблеми з валідацією вхідних даних. Мало того що код що займається валідацією застарів ще у 1998-му, так він ще і не завжди працює. Скажімо, для GUI працює, а для batch - ні. Ну і там все в стилі ранніх C - дикі пляски з void* і ручна типізація.
Я колись займався сайтами, і був у мене сайтовий рушій. Рушій не мій, його свого часу написав один класний чувак. І найбільше мені там подобалось те як влаштована валідація і препроцесинг вхідних даних форм.
Коли я робив систему моніторингу для атомщиків, я спробував втілити ідеї із того сайтового рушія у C++. Вийшло не дуже.
А тут я взявся за справу серйозно, і от що отримав:
Обережно, мозковинос! )
Приклади використання у main(). Початкова реалізація вимагала явного використання compose. Потім я додав overloaded operator <<, але ця реалізація вимагала ручного приведення типів (див. makeFunction). А потім я додав id() і все стало на свої місця!
Звісно, це тільки proof-of-concept. Зацініть монадичну композицію і identity function!
І да, CanFail<T> можна замінити на exception і використовувати звичайну композицію: "Expressive C++: Fun With Function Composition", "Function composition".
madf: (Default)
"На пальцях", для школярів.
Оригінальна стаття: The Algebra of Data, and the Calculus of Mutation
Переклад російською: Алгебра данных и исчисление мутаций
Якось я раніше її не зустрічав, хоча і стаття й переклад - 2009-го року.
За наводкою [livejournal.com profile] sorhed

Profile

madf: (Default)
madf

April 2017

S M T W T F S
      1
2345678
9101112131415
1617 1819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 03:13 pm
Powered by Dreamwidth Studios