Виразність
May. 22nd, 2014 02:13 pmВипадково помітив:
Для чого це потрібно? Іноді буває необхідно проітеруватись по enumeration. Не городити ж для цього масив, в кінці кінців...
PS: ага, і Shell, і плюсовий код теж можна в один рядок записати. Але ж читабельність...
POSIX Shell | C++98/03 | C++11 | Haskell | |||||||
#!/bin/sh for i in {1..4} do echo $i done |
|
|
module Main where main = mapM_ print [1..4] |
|||||||
6 LOC | 9 LOC | 8 LOC | 3 LOC |
Для чого це потрібно? Іноді буває необхідно проітеруватись по enumeration. Не городити ж для цього масив, в кінці кінців...
PS: ага, і Shell, і плюсовий код теж можна в один рядок записати. Але ж читабельність...
Граблі дитячі
Feb. 11th, 2014 10:02 pmСьогодні раптово виявив що у хаскелевій System.Directory немає функції переміщення файлу. Є тільки перейменування.
Різниця суттєва: неможливо перейменувати файл так що нове розташування знаходиться на іншому фізичному пристрої. Помилка приблизно така:
rename: unsupported operation (Invalid cross-device link)
Вихід, звісно, простий:
moveFile :: FilePath -> FilePath -> IO()
moveFile source dest = copyFile source dest >> removeFile source
Різниця суттєва: неможливо перейменувати файл так що нове розташування знаходиться на іншому фізичному пристрої. Помилка приблизно така:
rename: unsupported operation (Invalid cross-device link)
Вихід, звісно, простий:
moveFile :: FilePath -> FilePath -> IO()
moveFile source dest = copyFile source dest >> removeFile source
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++. Якщо не помиляюсь,
zamotivator колись писав про те що дизайнив шаблонні метапрограми у Scheme (чи іншому ліспі) а потім кодував на плюсах.
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]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Монади у народному хазяйстві
May. 11th, 2013 07:03 pmBartosz Milewski підняв цікаву тему: як функтори, аплікативні функтори і монади допомагають боротися з інверсією управління при використанні асинхронного API (в контексті C++).
Відео: „Вступ і про функтори“, „Аплікативні функтори“, „Монади“.
Слайди: https://www.fpcomplete.com/wp-content/uploads/2012/09/Functional-Patterns.pdf
( Read more... )
Відео: „Вступ і про функтори“, „Аплікативні функтори“, „Монади“.
Слайди: https://www.fpcomplete.com/wp-content/uploads/2012/09/Functional-Patterns.pdf
( Read more... )
XMonad, Zipper і всі-всі-всі
Mar. 31st, 2013 04:26 pmПрекрасне відео про нутрощі 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 можна знайти цитату самого Олега:
Продовження: 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"
Digging in XMonad
Mar. 24th, 2013 08:45 pmЄ одна кльова софтинка, яку я давно використовую. Але мене задовбували у ній два дуже неприємних баги: хтозна-чого вона жерла CPU як не в себе, і її вікно іноді ховалось під інші вікна (хоча завжди повинне бути on top).
Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.
Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
( Якщо вам не страшний код на Haskell можете зазирнути під кат )
Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.
Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
( Якщо вам не страшний код на Haskell можете зазирнути під кат )
C++, Maybe
Dec. 23rd, 2012 08:46 pmКолись, якщо я не помиляюсь,
ivan_gandhi писав що методи get це зло. На жаль, я того посту знайти не можу. Пам’ятаю тільки що у коментарях хтось як альтернативу запропонував методи with. Я тоді не звернув увагу.
( Не знаю, не знаю... )
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
( Не знаю, не знаю... )
read виявився вельми небезпечним. На ньому "лажає" строга типізація.
Логічно, в принципі. Але фіг відловиш таку помилку. А через таку дрібничку більше доби не працював сервіс :(
PS: Зате зробив нормальне журналювання.
Prelude> (read "1.0") :: Double 1.0 Prelude> (read "1.0") :: Maybe Double *** Exception: Prelude.read: no parse
Логічно, в принципі. Але фіг відловиш таку помилку. А через таку дрібничку більше доби не працював сервіс :(
PS: Зате зробив нормальне журналювання.
Генератор новомов
Dec. 25th, 2011 01:36 pmРеализация конструирования N-грамм и генерации псевдо ЕЯ-текста на их основе на языке Haskell
Перли:
ПОКАТЬ
ТОЛИЗЯМАРЦЕЛИЙ
ХРУЧАКЕКАВЕТОБЕРНОЛЬМ
НАХ ПОРЕЖДУГИ ПОХ
Ну і коронне:
СИНЬОР ЛОРЕНЦО КОЗЛЮБИМЫЙ ГРУБО И ЕСТАТЬСЯ БЛИ
Перли:
ПОКАТЬ
ТОЛИЗЯМАРЦЕЛИЙ
ХРУЧАКЕКАВЕТОБЕРНОЛЬМ
НАХ ПОРЕЖДУГИ ПОХ
Ну і коронне:
СИНЬОР ЛОРЕНЦО КОЗЛЮБИМЫЙ ГРУБО И ЕСТАТЬСЯ БЛИ
XMonad, Gentoo
Dec. 13th, 2011 12:50 pmСьогодні після чергового незначного допилювання xmonad.hs він при компіляції показав мені смачну і велику дулю: Could not find module: `XMonad.Prompt.AppendFile'.
Solution: haskell-updater --all. Чомусь -u не допоміг.
Відкрив для себе tabbed layout. Правда, поки не придумав де його можна застосувати. Мабуть для full-screen applications тіпа firefox чи okular.
Solution: haskell-updater --all. Чомусь -u не допоміг.
Відкрив для себе tabbed layout. Правда, поки не придумав де його можна застосувати. Мабуть для full-screen applications тіпа firefox чи okular.
Parsec vs. Boost.Spirit
Sep. 6th, 2010 12:11 pmВчора осилив Parsec. Після Boost.Spirit такі штуки мене вже більше не дивують. Вражає лише лаконічність коду: BNF перекладається майже без проблем. Із ghci дуже зручно тестувати парсери і їх комбінації (вихлоп g++ при помилках у Boost.Spirit мене досі лякає).
Коротше кажучи, приємна і зручна у користуванні бібліотека.
Цікаво те що і Parsec і Boost.Spirit у мене випливли в одному й тому ж проекті. Сам проект на C++, а одну маленьку утиліту вирішив спробувати написати на Haskell (отримавши натхнення від статті Дмитра Астапова "Давно не брал я в руки шашек"). Низхідне проектування майже вийшло, тільки в кінці на одній функції застряг. Треба буде пошукати як прийнято у Haskell обробляти помилки.
Коротше кажучи, приємна і зручна у користуванні бібліотека.
Цікаво те що і Parsec і Boost.Spirit у мене випливли в одному й тому ж проекті. Сам проект на C++, а одну маленьку утиліту вирішив спробувати написати на Haskell (отримавши натхнення від статті Дмитра Астапова "Давно не брал я в руки шашек"). Низхідне проектування майже вийшло, тільки в кінці на одній функції застряг. Треба буде пошукати як прийнято у Haskell обробляти помилки.
HaskellWiki
Jun. 20th, 2010 09:08 pmВиправив 1 помилку на HaskellWiki і зробив одне покращення.
Стаття: X window programming in Haskell
Помилка була у передостанньому прикладі. А саме - був відсутній виклик initThreads (аналог XInitThreads) що призводило до спонтанних падінь програми.
Покращення стосується потоку відправки подій Expose. У старій версії такий потік (нитка?) створювався на кожну подію у updateWin, в результаті потоки множились без міри (наприклад якщо часто клацати мишкою по вікну). Я зробив sendExposeEvent рекурсивною і виніс forkIO із updateWin у main.
Моя перша правка :)
Стаття: X window programming in Haskell
Помилка була у передостанньому прикладі. А саме - був відсутній виклик initThreads (аналог XInitThreads) що призводило до спонтанних падінь програми.
Покращення стосується потоку відправки подій Expose. У старій версії такий потік (нитка?) створювався на кожну подію у updateWin, в результаті потоки множились без міри (наприклад якщо часто клацати мишкою по вікну). Я зробив sendExposeEvent рекурсивною і виніс forkIO із updateWin у main.
Моя перша правка :)
http://blog.sigfpe.com - цікаво чувак пише.
Рекомендую:
What's all this E8 stuff about then? Part 1.
What's all this E8 stuff about then? Part 2.
What's all this E8 stuff about then? Part 3.
The Three Projections of Doctor Futamura
Пише дуже простою мовою, наводить ілюстрації.
Рекомендую:
What's all this E8 stuff about then? Part 1.
What's all this E8 stuff about then? Part 2.
What's all this E8 stuff about then? Part 3.
The Three Projections of Doctor Futamura
Пише дуже простою мовою, наводить ілюстрації.
Спостереження
Nov. 20th, 2009 08:57 amКоли починаєш цікавитись якоюсь специфічною темою починаєш помічати цю ж тему у інших знайомих (очно чи заочно) тобі людей.
Цей тиждень у мене пройшов у розборках з монадами. І тут на тобі: Микола Стрєбков теж пише про них :)
Свій власний "туторіал" на цю тему я напишу пізніше. А може й не напишу.
Цей тиждень у мене пройшов у розборках з монадами. І тут на тобі: Микола Стрєбков теж пише про них :)
Свій власний "туторіал" на цю тему я напишу пізніше. А може й не напишу.
Glasgow Haskell Compiler написано на Haskell. Таким чином для того щоб зібрати GHC потрібно зібрати GHC, зібраний за допомогою GHC... І ніяк не вирватись із цього порочного круга!
А все просто насправді:
А все просто насправді:
$ ls -l /usr/portage/distfiles/ghc-* -rw-rw-r-- 1 portage portage 7072545 лис 14 10:46 /usr/portage/distfiles/ghc-6.8.2-src.tar.bz2 -rw-rw-r-- 1 portage portage 30872949 лис 14 10:51 /usr/portage/distfiles/ghc-bin-6.8.2-x86.tbz2 -rw-rw-r-- 1 portage portage 940742 лис 14 10:51 /usr/portage/distfiles/ghc-bundled-readline-5.2_p13-x86.tbz2
Функціонально-котяче
Nov. 3rd, 2009 09:07 pmВвечері обговорювали з murkt'ом вкид лайна на вентилятор останный пост від
zabivator'а, і murkt кинув посилання на пару лямбда-котів. Я там навіть пару фоток від Дмитра Астапова aka
_adept_ бачив :)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)