Go to mobile version

You are viewing [info]squadette's journal

Алексей Махоткин - [entries|archive|friends|userinfo]
Alexey Mahotkin

[ website | Алексей Махоткин: домашняя страница ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| Mircea Eliade | Букинистические магазины Москвы ]

[Nov. 8th, 2009|04:26 pm]
Previous Entry Add to Memories Share Next Entry
Кирпичёв правильно пишет про небрежность интуитивного понимания императивных языков: http://antilamer.livejournal.com/300607.html.
 
Однако, мне кажется, что важно было бы озвучить, что всё то, что сейчас скрывается под именем "монада" -- само по себе достаточно спутанно в плане педагогики и евангелизма.  Классическая шутка SPJ/Вадлера звучит как "нам следовало назвать ЭТО warm fuzzy things, чтобы не пугать людей теоркатом".  Шутка поразительно недальновидная.   Проблема лежит в той же плоскости, что и называние стоящих перед тобой задач словом "stuff" (это то, с чем борется Аллен в своём GTD).  
 
Монады в настоящий момент являются миру как сложный ком из исторически обусловленных причин, проблем, решений, технических возможностей и теоретических основ (как алгебраических, так и аспектов теории вычислений). 
 
Все эти наслоения можно (и нужно) расщепить в первом приближении так (порядок приблизительно случайный):
 
  • стремление к экспликации эффектов (чистое внедрение императивно-подобных моментов в вычисление), (см. труды Вадлера);  здесь мы включаем ввод-вывод, STM, параллельные вычисления и проч.)
  • удобный механизм для материализации базовых микро-стратегий вычисления -- вызов функции (call-by-name/call-by-value), многозначность, смена состояния (присваивания!), обработка исключений, останов при неудаче, continuations, бэктрекинг;
  • typeclasses как механизм внесения монад в язык, и как следствие -- удобный механизм для мета-перехвата вычисления (невероятно удобно для domain-specific embedded languages);
  • строгая проверка типов, проистекающая из использования typeclasses, и позволяющая механически проверять корректность использования объектов;
  • существование монадических законов, в которые укладываются монады, что позволяет материализовывать абстрактные комбинаторы; это позволяет находить порой неожиданные изоморфизмы между различными предметными областями, а также помогает при оптимизации и верификации программ;
  • проработанная теоретическая основа (теория категорий), на которой базируются монады; это облегчает жизнь создателям базовых библиотек, на которых потом базируется всё реальное программирование;
  • монады -- лишь один из классов в длинной цепочке интересных алгебраически обусловленных классов, некоторые из которых слабее монад, а некоторые -- сильнее: Functor, Applicative, Monoid, Traversable, Foldable, Monad со товарищи, Arrow со товарищи;
  • стремление к материализации некоторых видов вычислений в алгебраическую структуру (моноидальные вычисления); это открывает широкий простор для оптимизаций, верификации программ, создания абстрактных комбинаторов, а также устранение unbounded recursion -- по мощности результатов это похоже на то, как когда-то ввод-вывод был надежно изолирован в IO Monad;
  •  

Потратим по паре абзацев на каждый пункт.
 
Экспликация эффектов. Clean первым (ЕМНИП) справился с тем, чтобы уложить ввод-вывод в экосистему чистого ленивого языка.  Ввод-вывод -- лишь первый эффект, с которым справились таким образом.  Сейчас всё, что не укладывается в чистоту и ленивость, оформляется в виде эффектов: транзакции (и их взаимодействие с вводом-выводом), генераторы случайных чисел, синхронизация при параллельных вычислениях).    Кроме того, что связано с внешним миром, сюда также идут вычисления, которые не укладываются в родную семантику языка -- например, строгое вычисление аргументов функций (как во всех императивных языках).
 
Эффекты позволяют беспокоиться только о четком ограниченном подмножестве проблемы, ведь всё что вне эффектов -- это очень "простые" вещи, которые не могут "навредить" -- там нет deadlocks, там не надо думать о барьерах и порядке вычисления.  Чудовище, таким образом, загоняется в клетку.
 
См. 1. SPJ "Beautiful concurrency" http://www.ece.iastate.edu/~pjscott/beautiful.pdf
2. Wadler "The essence of functional programming" http://mynd.rinet.ru/~alexm/monads/essence.pdf
4. Киселёв et al. "Purely Functional Lazy Non-deterministic programming" http://www-ps.informatik.uni-kiel.de/~sebf/pub/icfp09.html
 
Базовые микро-стратегии вычисления.  Не забываем, что люди, стоявшие у истоков Haskell, в первую очередь были заинтересованы в программировании самого компилятора.  С помощью монад можно эксплицировать все базовые процессы, происходящие при вычислении -- вызовы функций с разными методами передачи аргументов, лексическую и динамическую вложенность переменных (Env), обработку исключений, выразить присваивание через машину состояний (State), неоднозначные вычисления (amb/List), вычисления с неудачей (Maybe/Error), continuations (Cont), бэк-трекинг. 
 
Отдельной областью исследований были также модульные интерпретаторы, реализованные через монады и сопутствующие monad transformers. Такая конструкция позволяла конструировать интерпретатор нужного языка (например, арифметика + вызов функций + неоднозначность) простым комбинированием отдельных компонентов интерпретатора.   Каждый отдельный компонент изолирован от остальных и позволяет раздельную разработку.
 
Понятно, что такой подход позволяет один раз написать соответствующий блок, проверить его, и использовать для любой задачи, требующей создания интепретатора или даже компилятора).
 
См. 1. Guy L. Steele Jr. "Building Interpreters by Composing Monads", http://mynd.rinet.ru/~alexm/monads/steele.pdf
2. S. Liang, P. Hudak "Modular Denotational Semantics for Compiler Construction" http://mynd.rinet.ru/~alexm/monads/liang2.pdf
3. S. Liang, P. Hudak "Modular Monadic Semantics", 1998 http://flint.cs.yale.edu/trifonov/cs629/modular-monadic-semantics.pdf

Механизм для мета-перехвата вычислений.  Монады в Haskell реализуются через typeclasses, которые чем-то похожи то ли на interfaces в Яве, то ли на concepts в C++.   Typeclasses совершенно ортогональны монадам!   Typeclasses позволяют "перехватить" вычисление в другой тип результата.   

Например, можно написать на Haskell функцию для вычисления корней квадратного уравнения.  Её можно вычислить, передав ей три аргумента -- тогда она вернет пару корней.   С помощью typeclasses можно "вычислить" эту функцию в другом контексте так, что результатом вычисления будет код на JavaScript, который представляет собой JavaScript-функцию, вычисляющую корни квадратного уравнения.    

Таким образом, можно отделить разработку базового алгоритма от способа его вычисления.

Активно развивающейся областью сейчас является написание DSL для параллельных вычислений.  Можно написать на Haskell векторизованный алгоритм, к котором потом написать ряд бэкендов: для SSE, для CUDA, для обычного C, для любой другой векторизующей технологии, которая ещё не появилась.   Естественно, алгоритм этот можно попросту вычислять прямо из Haskell, чтобы отлаживать его принципиальную корректность.

См. 1. презентацию Lennar Augustsson "Strongly Types DSEL"  http://www.infoq.com/presentations/Strongly-Typed-DSEL-Lennart-Augustsson (в конце идёт рассказ о языке для генерации Excel-файлов); PDF
 
 
 
Монадические законы, теоретические основы, младшие и старшие братья монад.  Обеспечивают возможность формально доказать некоторые базовые вещи, чтобы быть хоть сколько-то уверенным в том, что фундамент не подведет.  Это интересно не только авторам самых базовых библиотек, но и тем, кто добрался до задач с такой сложностью, когда каждая возможность автоматической самопроверки приветствуется с энтузиазмом.  
 
Вместе со строгой проверкой типов это позволяет ловить ситуации, когда задача недопонята, сформулирована противоречиво, или просто сложнее, чем кажется.  Также это позволяет развивать программу, резко снижая вероятность внесения ошибочных изменений.   Так, Galois в своей презентации говорят, что постоянно пытаются закодировать те или иные требования к коду в виде сигнатуры типов.  

Также формальная структура (в том числе в моноидальном стиле) открывает широкий простор для оптимизаций на уровне компилятора (в том числе, управляемых программистом через механизм rules).  Некоторые жёстко структурированные функции удаётся соптимизировать максимально близко к машинному коду, при этом не жертвуя абстрактностью исходного кода.
 
 
2. http://comonad.com/reader/2009/iteratees-parsec-and-monoid/  (моноидальный стиль)
 
3. http://www.cse.unsw.edu.au/~dons/papers/CLS07.html (dons et al. "Stream Fusion: From Lists to Streams to Nothing at All)
 
linkReply

Comments:
[User Picture]From: [info]squadette
2009-11-08 01:53 pm (UTC)

(Link)

Рекламная пауза и апдейты:

а) http://friendfeed.com/commonaditization клуб любителей монады

б) http://undev.ru/position/rails-developer.html нам нужны разработчики, и не только ruby/rails, но и Objective C (программировать нагруженные сетевые серверы), Perl (чтобы хачить MogileFS), Erlang (тоже серверы).

в) ещё про моноиды: http://apfelmus.nfshost.com/monoid-fingertree.html
[User Picture]From: [info]squadette
2009-11-08 02:05 pm (UTC)

(Link)

г) ещё про моноиды: http://lionet.livejournal.com/31629.html?nc=3
[User Picture]From: [info]squadette
2009-11-08 02:21 pm (UTC)

(Link)

д) очень хороший каталог typeclasses ("Typeclassopedia"): http://www.haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf
[User Picture]From: [info]pirson
2009-11-08 02:24 pm (UTC)

(Link)

пост не для девочек явно
[User Picture]From: [info]antilamer
2009-11-08 02:32 pm (UTC)

(Link)

Великолепный пост, спасибо!
[User Picture]From: [info]squadette
2009-11-08 02:37 pm (UTC)

(Link)

реквестирую пеар!
[User Picture]From: [info]antilamer
2009-11-08 02:40 pm (UTC)

(Link)

Уже сослался в своем посте про монады.
[User Picture]From: [info]mr_aleph
2009-11-08 03:09 pm (UTC)

(Link)

Механизм для мета-перехвата вычислений


У меня пошел дым из головы от такой формулировки. Честно.
Cлово "перехват" у меня вызывает совсем другие ассоциации. Я понимаю, что вы хотите сказать, но...

Это перевод какой-то иностранной фразы?

Её можно вычислить, передав ей три аргумента -- тогда она вернет пару корней.


На трёх аргументах меня разорвало. Как такое сделать (Num для туплов что-ли определить? но тогда это не три аргумента вовсе, а один) и почему из трёх аргументов получилось два корня?
Непонятно...
[User Picture]From: [info]squadette
2009-11-08 03:16 pm (UTC)

(Link)

ну а как ещё назвать то, что происходит при вычислении с заданным типом, переопределенном через typeclasses?

квадратное уравнение это ax^2+bx+c=0. функция принимает три аргумента a, b, c и возвращает пару корней (x1, x2).

не понимаю что именно тут может разорвать
[User Picture]From: [info]mr_aleph
2009-11-08 03:22 pm (UTC)

(Link)

ну не перехват же...

ага, я подумал о том, что это решение квадратного уравнения, но теперь внимание вопрос: как такое написать (т.е. функцию sqrt :: (A a, B b) => a -> b или аналогичное, которая может и уравнение решить и простой корень извлечь)? я сходу что-то не смог.

каптча suxxxx
[User Picture]From: [info]squadette
2009-11-08 03:36 pm (UTC)

(Link)

оговорка, поправил

"функцию вычисления корней квадратного уравнения"

простите
[User Picture]From: [info]mr_aleph
2009-11-08 03:55 pm (UTC)

(Link)

а всё-таки: мне интересно как написать такую функцию и какой тип она будет иметь =)
[User Picture]From: [info]squadette
2009-11-08 04:05 pm (UTC)

(Link)

смысл там такой, что например все числа принадлежат тайпклассу Num. Инстанциировав этот тайпкласс в другом типе, мы можем переопределить все операции, применимые к нему.

Например, мы можем перехватить функцию "плюс", сделав так, чтобы выражение 3 + 2, вычисленное в строковом контексте, возвращало строку "3 + 2".

а) http://hackage.haskell.org/package/repr

б) посмотрите конец презентации Августссона на видео (лучше) или на слайдах.

там где он рассказывает про генерацию экселя.

http://www.infoq.com/presentations/Strongly-Typed-DSEL-Lennart-Augustsson

http://qconsf.com/sf2008/file?path=/qcon-sanfran-2008/slides//LennartAugustsson_strongly_typed.pdf

[User Picture]From: [info]mr_aleph
2009-11-08 04:14 pm (UTC)

(Link)

да понимаю я в чем смысл, трюк это мне знаком... я не понимаю как это применить, чтобы получить функцию sqrt с заданными свойствами.

Вы же не просто так это написали? Значит, должны представлять как это сделать.

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

[User Picture]From: [info]squadette
2009-11-08 04:18 pm (UTC)

(Link)

смотрим PDF: стр. 48, где показано как использовать при генерации экселя функцию solve, объявленную на стр. 26

ну либо я опять что-то упустил, и нужен [info]jsn, чтобы объяснил
[User Picture]From: [info]mr_aleph
2009-11-08 04:29 pm (UTC)

(Link)

ах ты ж блин! вы оказывается существенно поменяли текст... а я протупил и не посмотрел.

ну в такой формулировке, конечно, всё понятно и правильно.

а я думал совсем об иной задаче: написать функцию sqrt, которая будучи применённая к числу возвращает корень из этого числа; а будучи применённой к тройке чисел (a,b,c) возвращает корни квадратного уравнения с коэффициентами (a,b,c).

// всё еще думаю, каким словом я бы заменил слово "перехват".
[User Picture]From: [info]squadette
2009-11-08 04:30 pm (UTC)

(Link)

да, текст не вычитан
release early, release often

наверняка там ещё что-нибудь такое же есть :(
[User Picture]From: [info]squadette
2009-11-08 03:38 pm (UTC)

(Link)

капча безусловно suxxx, но "клуб любителей минета в твоём городе" сосёт ещё больше

и заливать оно начинает конкретно
[User Picture]From: [info]jsn
2009-11-08 03:23 pm (UTC)

(Link)

ну надо, наверное, различать квадратные корни и корни квадратного уравнения (square root vs quadratic equation roots? or something)
[User Picture]From: [info]squadette
2009-11-08 03:35 pm (UTC)

(Link)

оговорка, поправил

"функцию вычисления корней квадратного уравнения"

простите
[User Picture]From: [info]kouzdra
2009-11-08 05:14 pm (UTC)

(Link)

Монады это просто некоторый оригинальный (то есть не имеющий аналогий в пролом design-pattern/control-structure). Забавен двумя вещами - абстрагирует побочные эффекты в виде чего-то типа "универсального state transformer", и что более интересно - одновременно и коллекции - в частности list/etc comprehensions тоже абтрагируются монадами.

Больше пожалуй в нем ничего нет.

В принципе в этом стиле можно и на ML писать - только общность страдает.
[User Picture]From: [info]emsi
2009-11-08 08:10 pm (UTC)

(Link)

круто, спасибо!

прекрасный пост для таких умственно ленивых как я :)
From: (Anonymous)
2009-11-08 09:14 pm (UTC)

(Link)

мне понравились две иллюстрированные реакции

http://habrahabr.ru/blogs/haskell/74649/#comment_2157185
и
http://avva.livejournal.com/2158606.html?thread=66471694#t66471694
[User Picture]From: [info]jsn
2009-11-09 03:30 am (UTC)

(Link)

@афтар: супер. комменты на хабре сами по себе доставляют очень, но вдвойне -- потому что они в сообществе, посвящённом хаскеллу, и в квадрате -- потому что являются дистиллятом реакции прочей общественности, которая (barring a few too well-rounded outliers) по сути такая же.

то есть наблюдается два вида реакций:
1. креатив очень заумный и непонятный, афтар мудак!, и
2. креатив очень заумный и непонятный, афтар молодец!

...что, конечно, является хорошим результатом в полевой социопсихологии, но несколько расстраивает во всех остальных аспектах.

я, то есть, поражаюсь, каких эффектов можно достичь одним постом, в котором нету сисек, антисемитизма и призывов к массовым расстрелам, а самой близкой к нецензурщине лексемой является слово "монада".
[User Picture]From: [info]squadette
2009-11-09 05:07 am (UTC)

(Link)

ну это же активисты, носители морального большинства

я на самом деле поражаюсь тому, насколько у нас чёткая общественная мораль в интернете

что demotivation.ru, что anekdot.ru (который вообще сраный НЕОКОНСЕРВАТИЗМ (тм)), что bash.org.ru

ну и хабр не отстаёт
даже уже появился человек, который спросил, что я за полтора года написал на хаскелле! чтобы значит понять, тунеядец я или нет
[User Picture]From: [info]emdin
2009-11-09 08:59 am (UTC)

(Link)

> anekdot.ru (который вообще сраный НЕОКОНСЕРВАТИЗМ
> (тм)),

дадада
такой концентрации бывших военных и прочих нелюдей в камуфляже не встретишь даже в клубе любителей авторской песни.
[User Picture]From: [info]xfyre
2009-11-09 11:11 am (UTC)

в коллекцию реакций

(Link)

я например был заинтригован достаточно, чтобы пойти, скачать и поставить дистрибутив; и это при всей моей скептичности и инженерной, кхе-кхе, приземленности.

с другой стороны, за стиль изложения АлексейГеннадьичу насовали совершенно по делу, IMHO :)

нельзя так, нужно быть добрее к людям или хотя бы предупреждать что текст требует существенного знакомства с предметом.
[User Picture]From: [info]jsn
2009-11-09 11:59 am (UTC)

Re: в коллекцию реакций

(Link)

ровно наоборот. это же не хаскельного евангелизму псот. т.е., при всём уважении, расчитан он не на то, что ты поставишь себе хаскель в качестве арифмометра пеано, а на то, что ты в ответ скажешь ээ ну не знаю:

что "мета-перехват", возможно, имело смысл с-реверс-транслейтить как "capture the essence of", которое потом, наверное, можно было бы перевести на русский как-нибудь адекватно, и что этот essence, собственно, и оказывается приятной и полезной алгебраической структурой, из чего уже вытекают возможности трансформации, верификации и оптимизации all alike, дальше ещё что-нибудь о том, что так и должно всё устраиваться в жизни у людей с типизированным ленивым лямбда-исчислением -- и тут уже читателю становится очевидной маркетинговая сущность популярных монадных тьюториалов, лживых, как и вся пионерская пропаганда,

...ну или ещё какую лабуду в этом роде, я в этом ничего не понимаю!

то есть, tl;dr: если автор видит возможность сделать стиль изложения ещё резче и требовать знакомства с предметом ещё жёстче, то ему, по мнению искренне вашего, как раз следует это сделать -- а то в комменты набегают всякие случайные люди типа искренне вашего, который, между прочим, с понятием "монады"-то знаком исключительно по ссылке на лейбница в "чапаеве и пустоте", а хаскеля никогда не держал в руках даже самого завалящего.
[User Picture]From: [info]cmm
2009-11-09 12:05 pm (UTC)

Re: в коллекцию реакций

(Link)

имело смысл с-реверс-транслейтить как "capture the essence of"

"грабить корованы с горючим"!
[User Picture]From: [info]jsn
2009-11-09 12:07 pm (UTC)

Re: в коллекцию реакций

(Link)

а?! что?! я всё неправильно написал?!
[User Picture]From: [info]cmm
2009-11-09 12:11 pm (UTC)

Re: в коллекцию реакций

(Link)

по-моему правильно, но я ещё/уже/ойвей не настоящий сварщик.
просто по-моему такого рода дискурс должно вести по-английски, целевой аудитории будет только проще.
[User Picture]From: [info]squadette
2009-11-09 01:59 pm (UTC)

Re: в коллекцию реакций

(Link)

кстати да

следующий пост на хабр надо делать по-английски

карму в минуса!
[User Picture]From: [info]xfyre
2009-11-09 01:00 pm (UTC)

(Link)

чем бы там этот текст ни являлся - это сообщение, вынесенное в публичное поле. получателем сообщения является "кто угодно, интересующийся хаскеллом". в данном случае этот ктоугодно оказался в массе своей праздноинтересующимся, и совершенно закономерно охуел.

полтора абзаца про "зачем этот текст" и "для кого этот текст" вряд ли способны в такой ситуации что-то содержательно испортить, а вот снизить количество неконструктивного фидбэка - запросто.
[User Picture]From: [info]squadette
2009-11-09 02:00 pm (UTC)

(Link)

я сторонник когнитивных встрясок.

а то расслабились там на своих плагинах к файерфоксу :)
[User Picture]From: [info]xfyre
2009-11-09 02:30 pm (UTC)

(Link)

брателло, ну если это троллинг, то он был успешен - не вопрос :)
[User Picture]From: [info]jsn
2009-11-09 02:09 pm (UTC)

(Link)

да не, ну поле-шмоле :) эдак можно начать перед словом "хуй" произносить "осторожно, следующее высказывание содержит ненормативную лексику". а это, как мы понимаем, скользкая дорожка -- сначала начинаешь извиняться за сложность материала, потом пишешь тьюториалы попроще, потом из языка пропадают анонимные лямбда-выражения, and before you know it, you've got yet another wildly successful next see-sharp!

(а ихний SPJ завещал: "avoid success at all costs")
[User Picture]From: [info]squadette
2009-11-09 02:10 pm (UTC)

(Link)

> (а ихний SPJ завещал: "avoid success at all costs")

охуенно!
всё так
[User Picture]From: [info]xfyre
2009-11-09 02:37 pm (UTC)

(Link)

http://www.reddit.com/r/programming/comments/77z8h/avoid_success_at_all_costs_the_unofficial_slogan/

первый коммент там: "Well, they are doing quite a good job at living up to that slogan". ну, как бы да, нечего добавить :)
[User Picture]From: [info]109
2009-11-10 09:49 am (UTC)

(Link)

имело смысл

иметь смысл можно только в контексте какой-то цели, не так ли? какая тут цель? ну, если не считать очевидной, то, например, отнести свет некоего сакрального знания в народ. причём народ, как я понимаю, специально этого не просил.

в таких случаях выход только один - dumb it down и молиться, что мысль изречённая не до конца превратилась в свою противоположность.

иначе бесполезно - вот смотри на типичную реакцию даже там, где ответ даже как бы реквестирован, ибо человек как бы обращается в эху за помощью: http://community.livejournal.com/ru_sql/170837.html?thread=1629525#t1629525
[User Picture]From: [info]jsn
2009-11-09 12:06 pm (UTC)

Re: в коллекцию реакций

(Link)

p.s. ну кстати, @автор, альтернативой работе над стилем является размещение таких постов в [info]ru_declarative (хотя, вероятно, всё подписчики и так уже ознакомились).
[User Picture]From: [info]kika
2009-11-09 04:57 pm (UTC)

(Link)

Долгая дорога от дельфака, вощем.
[User Picture]From: [info]squadette
2009-11-09 04:59 pm (UTC)

(Link)

сколько же мне ещё мучаться, дядя Перцев?

(ищет в справочнике средний возраст появления склероза у пожилых)
[User Picture]From: [info]kika
2009-11-09 07:11 pm (UTC)

(Link)

Да не, я в том смысле что круто же. А читая хабру создается впечатление что чуть менее чем полностью комментаторов так и продолжают. Это, как его, дельфак.
[User Picture]From: [info]_zikoff
2009-11-18 08:27 pm (UTC)

(Link)

Махоткен! Пользуясь случаем, спешу с радостью послать тебя нахуй с твоими нахуй никому не нужными невразумительными сочетаниями букв русского алфавита.

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