Entry tags:
Виразність
Випадково помітив:
Для чого це потрібно? Іноді буває необхідно проітеруватись по 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, і плюсовий код теж можна в один рядок записати. Але ж читабельність...
Entry tags:
Граблі дитячі
Сьогодні раптово виявив що у хаскелевій 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
Оптимізації
Викочував апдейти на сервер і випадково глянув у лог PostgreSQL.
В результаті оптимізував два запити, один у 1500 разів, інший майже у 3000 (з близько 1 сек до 0.9 мс і 0.3 мс відповідно). У другому випадку довелось трішки змінити код, заодно поприбирав catch який раніше імпортувався із Prelude.
В результаті оптимізував два запити, один у 1500 разів, інший майже у 3000 (з близько 1 сек до 0.9 мс і 0.3 мс відповідно). У другому випадку довелось трішки змінити код, заодно поприбирав catch який раніше імпортувався із Prelude.
Entry tags:
Кілька презентацій на тему функціонального програмування у C++
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)
Entry tags:
Монади у народному хазяйстві
Bartosz 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... )
Entry tags:
XMonad, 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 можна знайти цитату самого Олега:
Продовження: 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
Є одна кльова софтинка, яку я давно використовую. Але мене задовбували у ній два дуже неприємних баги: хтозна-чого вона жерла CPU як не в себе, і її вікно іноді ховалось під інші вікна (хоча завжди повинне бути on top).
Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.
Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
( Якщо вам не страшний код на Haskell можете зазирнути під кат )
Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.
Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
( Якщо вам не страшний код на Haskell можете зазирнути під кат )
Entry tags:
C++, Maybe
Колись, якщо я не помиляюсь,
ivan_gandhi писав що методи get це зло. На жаль, я того посту знайти не можу. Пам’ятаю тільки що у коментарях хтось як альтернативу запропонував методи with. Я тоді не звернув увагу.
( Не знаю, не знаю... )
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
( Не знаю, не знаю... )
Entry tags:
Хаскельне
read виявився вельми небезпечним. На ньому "лажає" строга типізація.
Логічно, в принципі. Але фіг відловиш таку помилку. А через таку дрібничку більше доби не працював сервіс :(
PS: Зате зробив нормальне журналювання.
Prelude> (read "1.0") :: Double 1.0 Prelude> (read "1.0") :: Maybe Double *** Exception: Prelude.read: no parse
Логічно, в принципі. Але фіг відловиш таку помилку. А через таку дрібничку більше доби не працював сервіс :(
PS: Зате зробив нормальне журналювання.
Entry tags:
Генератор новомов
Реализация конструирования N-грамм и генерации псевдо ЕЯ-текста на их основе на языке Haskell
Перли:
ПОКАТЬ
ТОЛИЗЯМАРЦЕЛИЙ
ХРУЧАКЕКАВЕТОБЕРНОЛЬМ
НАХ ПОРЕЖДУГИ ПОХ
Ну і коронне:
СИНЬОР ЛОРЕНЦО КОЗЛЮБИМЫЙ ГРУБО И ЕСТАТЬСЯ БЛИ
Перли:
ПОКАТЬ
ТОЛИЗЯМАРЦЕЛИЙ
ХРУЧАКЕКАВЕТОБЕРНОЛЬМ
НАХ ПОРЕЖДУГИ ПОХ
Ну і коронне:
СИНЬОР ЛОРЕНЦО КОЗЛЮБИМЫЙ ГРУБО И ЕСТАТЬСЯ БЛИ
XMonad, Gentoo
Сьогодні після чергового незначного допилювання 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.
Entry tags:
Parsec vs. Boost.Spirit
Вчора осилив Parsec. Після Boost.Spirit такі штуки мене вже більше не дивують. Вражає лише лаконічність коду: BNF перекладається майже без проблем. Із ghci дуже зручно тестувати парсери і їх комбінації (вихлоп g++ при помилках у Boost.Spirit мене досі лякає).
Коротше кажучи, приємна і зручна у користуванні бібліотека.
Цікаво те що і Parsec і Boost.Spirit у мене випливли в одному й тому ж проекті. Сам проект на C++, а одну маленьку утиліту вирішив спробувати написати на Haskell (отримавши натхнення від статті Дмитра Астапова "Давно не брал я в руки шашек"). Низхідне проектування майже вийшло, тільки в кінці на одній функції застряг. Треба буде пошукати як прийнято у Haskell обробляти помилки.
Коротше кажучи, приємна і зручна у користуванні бібліотека.
Цікаво те що і Parsec і Boost.Spirit у мене випливли в одному й тому ж проекті. Сам проект на C++, а одну маленьку утиліту вирішив спробувати написати на Haskell (отримавши натхнення від статті Дмитра Астапова "Давно не брал я в руки шашек"). Низхідне проектування майже вийшло, тільки в кінці на одній функції застряг. Треба буде пошукати як прийнято у Haskell обробляти помилки.
HaskellWiki
Виправив 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.
Моя перша правка :)
Entry tags:
PR
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
Пише дуже простою мовою, наводить ілюстрації.
Entry tags:
Спостереження
Коли починаєш цікавитись якоюсь специфічною темою починаєш помічати цю ж тему у інших знайомих (очно чи заочно) тобі людей.
Цей тиждень у мене пройшов у розборках з монадами. І тут на тобі: Микола Стрєбков теж пише про них :)
Свій власний "туторіал" на цю тему я напишу пізніше. А може й не напишу.
Цей тиждень у мене пройшов у розборках з монадами. І тут на тобі: Микола Стрєбков теж пише про них :)
Свій власний "туторіал" на цю тему я напишу пізніше. А може й не напишу.
Entry tags:
GHC
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
Функціонально-котяче
Ввечері обговорювали з 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)