<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description> 




</description><title>vlan</title><generator>Tumblr (3.0; @vlan)</generator><link>http://vlan.tumblr.com/</link><item><title>Моноид в категории эндофункторов</title><description>&lt;p&gt;Монада является моноидом, если заменить декартово произведение множеств
композицией функторов (монада является функтором), умножение — функцией &lt;code&gt;join&lt;/code&gt;,
а единицу — &lt;code&gt;pure&lt;/code&gt;. Законы моноида при этом выполняются.&lt;/p&gt;

&lt;p&gt;Mac Lane S. &lt;em&gt;Categories for the Working Mathematician&lt;/em&gt;. — Springer, 1998:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A monad &lt;em&gt;T = &amp;#60; T, η, μ &amp;gt;&lt;/em&gt; in a category &lt;em&gt;X&lt;/em&gt; consists of a functor &lt;em&gt;T: X → X&lt;/em&gt; and
  two natural transformations &lt;em&gt;η: I_X → T&lt;/em&gt;, &lt;em&gt;μ: T^2 → T&lt;/em&gt;,
  which make the following diagrams commute &amp;lt;&amp;#8230;&amp;gt;&lt;sup&gt;*&lt;/sup&gt;.&lt;/p&gt;
  
  &lt;p&gt;Formally, the definition of a monad is like that of a monoid &lt;em&gt;M&lt;/em&gt; in sets
  &amp;lt;&amp;#8230;&amp;gt;.  The set &lt;em&gt;M&lt;/em&gt; of elements of the monoid is replaced by the endofunctor
  &lt;em&gt;T: X → X&lt;/em&gt;, while the cartesian product &lt;em&gt;⨯&lt;/em&gt; of two sets is replaced by
  composite of two functors, the binary operation &lt;em&gt;μ: M ⨯ M → M&lt;/em&gt; of
  multiplication by the transformation &lt;em&gt;μ: T^2 → T&lt;/em&gt; and the unit
  (identity) element &lt;em&gt;η: 1 → M&lt;/em&gt; by &lt;em&gt;η: I_X → T&lt;/em&gt;. We shall thus call
  &lt;em&gt;η&lt;/em&gt; the &lt;em&gt;unit&lt;/em&gt; and &lt;em&gt;μ&lt;/em&gt; the &lt;em&gt;multiplication&lt;/em&gt; of the monad &lt;em&gt;T&lt;/em&gt;; the first
  commutative diagram &amp;lt;&amp;#8230;&amp;gt; is then the &lt;em&gt;associative&lt;/em&gt; law for the monad, while
  the second and third diagrams express the left and right &lt;em&gt;unit laws&lt;/em&gt;,
  respectively. All told, a monad in &lt;em&gt;X&lt;/em&gt; is just a monoid in the category of
  endofunctors of &lt;em&gt;X&lt;/em&gt;, with product &lt;em&gt;⨯&lt;/em&gt; replaced by composition of endofunctors
  and unit set by the identity endofunctor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt; Диаграммы, на которые ссылается текст, описывают известные законы монад.&lt;/p&gt;

&lt;p&gt;Свяжем это с монадами в Haskell. &lt;em&gt;T&lt;/em&gt; — это &lt;code&gt;Monad m ⇒ m a&lt;/code&gt;, &lt;em&gt;η&lt;/em&gt; — это &lt;code&gt;pure ::
Monad m ⇒ a → m a&lt;/code&gt;, а &lt;em&gt;μ&lt;/em&gt; — &lt;code&gt;join :: Monad m ⇒ m (m a) → m a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Напомню, что эта категория называется &lt;strong&gt;Hask&lt;/strong&gt;. В ней объектами являются типы
Haskell, а морфизмами — функции. Композиция морфизмов — это &lt;code&gt;(.)&lt;/code&gt;, единичный
морфизм — &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Функторы Haskell &lt;code&gt;Functor&lt;/code&gt; являются функторами из &lt;strong&gt;Hask&lt;/strong&gt; в подкатегорию
&lt;strong&gt;Hask&lt;/strong&gt;, состоящую из типов, образованных приписыванием конструктора. То есть
типу &lt;code&gt;a&lt;/code&gt; ставится в соответствие тип &lt;code&gt;m a&lt;/code&gt;, а функции &lt;code&gt;a → b&lt;/code&gt; — функция &lt;code&gt;m a → m
b&lt;/code&gt;.&lt;/p&gt;</description><link>http://vlan.tumblr.com/post/1667447864</link><guid>http://vlan.tumblr.com/post/1667447864</guid><pubDate>Wed, 24 Nov 2010 10:27:00 +0300</pubDate><category>math</category><category>monad</category><category>monoid</category><category>fp</category><category>haskell</category></item><item><title>"f x = x. I don’t do very much but at least I’m unique."</title><description>“&lt;code&gt;f x = x&lt;/code&gt;. I don’t do very much but at least I’m unique.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;James Chapman (via &lt;a href="http://annayudi.tumblr.com/" class="tumblr_blog"&gt;annayudi&lt;/a&gt;)&lt;/em&gt;</description><link>http://vlan.tumblr.com/post/1048067586</link><guid>http://vlan.tumblr.com/post/1048067586</guid><pubDate>Wed, 01 Sep 2010 18:38:40 +0400</pubDate><category>programming</category><category>fp</category></item><item><title>Правила краткого кода</title><description>&lt;p&gt;Есть известные правила программирования в Unix. Мы решили обратить внимание на схожие правила, помогающие создавать краткий программный код:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Код должен быть читаемым текстом, но не на естественном языке&lt;/li&gt;
&lt;li&gt;Абстракции должны браться из спеки, а не из воздуха&lt;/li&gt;
&lt;li&gt;Плохо абстрагировать пост-фактум повторяющиеся куски&lt;/li&gt;
&lt;li&gt;Много строк — плохо, но много обозначений — тоже плохо&lt;/li&gt;
&lt;li&gt;Зло кроется в особых случаях&lt;/li&gt;
&lt;li&gt;Нужно локализовывать оптимизации любого уровня&lt;/li&gt;
&lt;li&gt;Не знаешь точно, пригодится ли код, — не пиши&lt;/li&gt;
&lt;/ol&gt;</description><link>http://vlan.tumblr.com/post/1042823935</link><guid>http://vlan.tumblr.com/post/1042823935</guid><pubDate>Tue, 31 Aug 2010 19:35:32 +0400</pubDate><category>programming</category><category>fp</category></item><item><title>Интервью со мной перед DevConf</title><description>&lt;p&gt;Я выступлю с &lt;a href="http://devconf.ru/python/offers/96"&gt;докладом&lt;/a&gt; об использовании внешних языков DSL и моей библиотеке &lt;a href="http://code.google.com/p/funcparserlib/"&gt;funcparserlib&lt;/a&gt; на &lt;a href="http://devconf.ru/"&gt;DevConf&lt;/a&gt; в секции Python. Конференция пройдёт в Москве 2010-05-17.&lt;/p&gt;

&lt;p&gt;Перед конференцией организаторы взяли у меня &lt;a href="http://devconf.ru/news/detail/54"&gt;небольшое интервью&lt;/a&gt;. В нём я упоминаю мои текущие проекты, рассказываю о теме предстоящего доклада.&lt;/p&gt;</description><link>http://vlan.tumblr.com/post/589612833</link><guid>http://vlan.tumblr.com/post/589612833</guid><pubDate>Tue, 11 May 2010 17:52:00 +0400</pubDate><category>funcparserlib</category><category>fp</category><category>devconf-ru</category><category>programming</category><category>python</category></item><item><title>Parallel vs Concurrent</title><description>&lt;p&gt;Сейчас многие интересуются языками, поддерживающими несколько взаимодействующих
потоков управления (Erlang, Clojure, Go). В них зелёные нити используются, в
основном, для организации &lt;em&gt;многозадачности (concurrency).&lt;/em&gt; В качестве моделей
многозадачности используются CSP или Actor model. То есть программа строится из
объектов-акторов, имеющих свою зелёную нить и обменивающихся сообщениями
(синхронно или асинхронно).&lt;/p&gt;

&lt;p&gt;Конечно хорошо, когда объекты перестают быть просто процедурами, связанными
одной нитью и одним стеком вызовов. Это полезно, например, для серверов с
множеством объектов-соединений и общими ресурсами. Однако подобное многозадачное
ООП — не единственный способ занять процессоры. К тому же существуют и другие
задачи.&lt;/p&gt;

&lt;p&gt;Многие задачи по своей природе не объектные, а функциональные. Для них модели
типа CSP или Actor model — не более, чем возможный способ ускорения обработки.
Вместо многозадачности (concurrency) здесь на первый план выступает
&lt;em&gt;параллельность (parallel programming).&lt;/em&gt; Достаточно большое число реальных задач
хорошо ложится именно в этот класс. В предметной области таких задач нет ни
слова про объекты и сообщения, но есть чисто техническая (ладно, математическая)
возможность произвести часть вычислений параллельно.&lt;/p&gt;

&lt;p&gt;Средства параллельности можно реализовывать поверх средств многозадачности, но
можно и иметь их встроенными в язык, хотя бы в виде библиотек. Иначе получается,
что для решения функциональной задачи приходится писать объектно-ориентированный
код.&lt;/p&gt;

&lt;p&gt;Некоторые известные типы параллельной обработки:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Map: обычное отображение, только параллельное; очень хорошо для списков, а для
произвольных функторов надо думать&lt;/li&gt;
&lt;li&gt;Map-Reduce: отобразить, а затем свернуть; можно делать по-разному, один из
вариантов — как в Google MapReduce, отобразить пары ключ-значение на новые
пары, затем сгруппировать по ключу и свернуть&lt;/li&gt;
&lt;li&gt;Fork-Join: если задача большая, разбить на подчасти и рекурсивно решить их
параллельно, объединив затем результат, иначе решить последовательно&lt;/li&gt;
&lt;li&gt;Pipeline: если задача представима как композиция функций над потоками, то
каждую функцию можно считать параллельно; нужны функции примерно одинаковой
сложности&lt;/li&gt;
&lt;/ul&gt;</description><link>http://vlan.tumblr.com/post/550446011</link><guid>http://vlan.tumblr.com/post/550446011</guid><pubDate>Mon, 26 Apr 2010 14:06:17 +0400</pubDate><category>parallel-programming</category><category>fp</category></item><item><title>Скорость "Hello World" на разных языках</title><description>&lt;p&gt;В Unix приветствуется создание небольших взаимодействующих программ, каждая из
которых &lt;a href="http://www.faqs.org/docs/artu/ch01s06.html"&gt;решает одну задачу&lt;/a&gt;. В частности, именно за счёт &lt;em&gt;процессов ОС&lt;/em&gt; решаются
проблемы параллелизации и многозадачности. Поэтому важно, чтобы программа
стартовала быстро и не выполняла того, о чём её не просит программист.&lt;/p&gt;

&lt;p&gt;Недавно я заинтересовался языком &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, который исповедует монолитный
подход к параллельности. Я решил провести небольшое сравнение скорости
выполнения крошечных программ &amp;#8220;Hello World&amp;#8221; на разных языках. Вот результаты
сравнения:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Clojure (интерпретатор): 3.7 сек, 26718 системных вызовов&lt;/li&gt;
&lt;li&gt;Clojure (компилятор): 2.9 сек, 23279 вызовов&lt;/li&gt;
&lt;li&gt;Haskell (интерпретатор): 0.675 сек, 1148 вызовов&lt;/li&gt;
&lt;li&gt;Java: 0.360 сек, 5160 вызовов&lt;/li&gt;
&lt;li&gt;Python: 0.091 сек, 804 вызова&lt;/li&gt;
&lt;li&gt;Scheme (Guile): 0.082, 240 вызовов&lt;/li&gt;
&lt;li&gt;Bash: 0.015 сек, 152 вызова&lt;/li&gt;
&lt;li&gt;Haskell (компилятор): 0.014 сек, 135 вызовов&lt;/li&gt;
&lt;li&gt;C: 0.002 сек, 24 вызова&lt;/li&gt;
&lt;/ul&gt;</description><link>http://vlan.tumblr.com/post/382577216</link><guid>http://vlan.tumblr.com/post/382577216</guid><pubDate>Thu, 11 Feb 2010 02:17:07 +0300</pubDate><category>clojure</category><category>fp</category><category>performance</category><category>programming</category><category>unix</category></item><item><title>Критика Actor Thinking</title><description>&lt;p&gt;Недавно натолкнулся на пост &lt;a href="http://www.javalimit.com/2010/01/actor-thinking.html"&gt;Actor Thinking&lt;/a&gt; об использовании акторов в стиле
Erlang для «естественной» реализации параллельности. В посте поясняются уже
знакомые слова Joe Armstrong об аналогии между акторами и объектами ООП.&lt;/p&gt;

&lt;p&gt;Мне кажется, в этих рассуждениях в очередной раз допускается ошибка
классического объектно-ориентированного подхода, будто почти все задачи
естественно решать в стиле взаимодействующих объектов с локальным изменяемым
состоянием. Наиболее ярко преимущества ООП выражаются как раз на системах без
общей памяти, т. е. на взаимодействующих &lt;em&gt;процессах&lt;/em&gt;. Тогда действительно люди
при разработке думают об интерфейсах, инкапсуляции и пр.&lt;/p&gt;

&lt;p&gt;При решении задач не нужно придумывать объекты. Сама задача уже говорит о том,
какие есть объекты, если они вообще есть. Мелкие многочисленные объекты, как и
мелкие параллельные процессы — это скорее недостаток, от которого следует
избавляться, а не расхваливать.&lt;/p&gt;</description><link>http://vlan.tumblr.com/post/327121664</link><guid>http://vlan.tumblr.com/post/327121664</guid><pubDate>Sun, 10 Jan 2010 19:54:00 +0300</pubDate><category>actors</category><category>oop</category><category>programming</category><category>fp</category></item></channel></rss>

