<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
<channel>
  <title>Recycled Bin</title>
  <link>http://lomeo.livejournal.com/</link>
  <description>Recycled Bin - LiveJournal.com</description>
  <lastBuildDate>Mon, 03 Mar 2008 08:08:11 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>lomeo</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>http://p-userpic.livejournal.com/31457311/2096061</url>
    <title>Recycled Bin</title>
    <link>http://lomeo.livejournal.com/</link>
    <width>80</width>
    <height>80</height>
  </image>

<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/41824.html</guid>
  <pubDate>Mon, 03 Mar 2008 08:08:11 GMT</pubDate>
  <title>INC</title>
  <link>http://lomeo.livejournal.com/41824.html</link>
  <description>0x20</description>
  <comments>http://lomeo.livejournal.com/41824.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/41713.html</guid>
  <pubDate>Mon, 25 Feb 2008 15:17:51 GMT</pubDate>
  <title>об абстрагировании</title>
  <link>http://lomeo.livejournal.com/41713.html</link>
  <description>&lt;q&gt;Хаскель предлагает достаточно удобный для большинства задач уровень абстракции - алгебраические типы, сравнение с образцом, классы типов. Забираясь выше, легко попасть в ловушку не решения проблемы предметной области, не достижения цели, а решения проблемы отображения решения проблемы предметной области на фиксированный уровень абстракции и ни ангстремом ниже.&lt;/q&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://thesz.livejournal.com/724753.html&quot;&gt;Здесь&lt;/a&gt; (&lt;span class=&apos;ljuser&apos; lj:user=&apos;thesz&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://thesz.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://p-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://thesz.livejournal.com/&apos;&gt;&lt;b&gt;thesz&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;)</description>
  <comments>http://lomeo.livejournal.com/41713.html</comments>
  <category>цитата</category>
  <category>программирование</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/41431.html</guid>
  <pubDate>Fri, 22 Feb 2008 18:40:40 GMT</pubDate>
  <title>ЙО!</title>
  <link>http://lomeo.livejournal.com/41431.html</link>
  <description>Видели уже наверное:&lt;br /&gt;&lt;a href=&quot;http://absurdopedia.wikia.com/wiki/Haskell&quot;&gt;http://absurdopedia.wikia.com/wiki/Haskell&lt;/a&gt;</description>
  <comments>http://lomeo.livejournal.com/41431.html</comments>
  <category>haskell</category>
  <category>смешно</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/41069.html</guid>
  <pubDate>Thu, 07 Feb 2008 13:32:19 GMT</pubDate>
  <title>Лем живее всех живых</title>
  <link>http://lomeo.livejournal.com/41069.html</link>
  <description>Трурль и Клапауций &lt;a href=&quot;http://rsdn.ru/forum/Message.aspx?mid=2828493&quot;&gt;опять спорят&lt;/a&gt;. Теперь уже о том, что называть функциональным языком.</description>
  <comments>http://lomeo.livejournal.com/41069.html</comments>
  <category>смешно</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/40707.html</guid>
  <pubDate>Sun, 27 Jan 2008 00:03:33 GMT</pubDate>
  <title>typechecker для dependent types system</title>
  <link>http://lomeo.livejournal.com/40707.html</link>
  <description>Заинтересовал меня всё таки &lt;span class=&apos;ljuser&apos; lj:user=&apos;kurilka&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://kurilka.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://p-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://kurilka.livejournal.com/&apos;&gt;&lt;b&gt;kurilka&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; тотальным ФП, а у &lt;span class=&apos;ljuser&apos; lj:user=&apos;deni_ok&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://deni-ok.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://p-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://deni-ok.livejournal.com/&apos;&gt;&lt;b&gt;deni_ok&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; и &lt;span class=&apos;ljuser&apos; lj:user=&apos;thesz&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://thesz.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://p-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://thesz.livejournal.com/&apos;&gt;&lt;b&gt;thesz&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; я понахватался ссылок и умных слов. Ну, ещё и  dependent types в стороне не остались.&lt;br /&gt;&lt;br /&gt;Подумал, что total fp будет неплохо смотреться для программирования на типах - гарантия завершения будет тут очень кстати.&lt;br /&gt;&lt;br /&gt;К сожалению, &quot;по семейным обстоятельствам&quot; я сейчас не в силах заняться чем нибудь серьёзно, поэтому всё, что я здесь пишу - скорее для себя, чтобы не забыть. Написано очень нудно (это тоже для себя, извините - я тупой) и сумбурно (а это так получилось).&lt;br /&gt;&lt;br /&gt;Итак что здесь? (чтобы вы решили читать или нет)&lt;br /&gt;Здесь размышления о том, как должен работать тайпчекер в системе с зависимыми типами. Я пытаюсь придумать приёмы, позволяющие строить гарантировано завершающиеся доказательства/опровержения.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Допустим, у нас есть тайп чекер, который разбирает следующее определение:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
append :: List a n -&amp;gt; List a m -&amp;gt; List a (n + m)
append []     ys = ys
append (x:xs) ys = x : (xs `append` ys)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Это вы наверняка уже сто раз видели, но я для проформы повторю основные определения: &lt;code&gt;List&lt;/code&gt; имеет тип (kind в терминах Haskell) - &lt;code&gt;* -&amp;gt; Nat -&amp;gt; *&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
data List :: * -&amp;gt; Nat -&amp;gt; *
    = []  :: List a 0
    | (:) :: a -&amp;gt; List a n -&amp;gt; List a (n + 1)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nat - тип натуральных чисел:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
data Nat :: *
    = Z :: Nat
    | S :: Nat -&amp;gt; Nat
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Запись вида &lt;code&gt;0, 1, 2&lt;/code&gt;... всего лишь синтаксический сахар для &lt;code&gt;Z, S Z, S (S Z)&lt;/code&gt;... А запись (&lt;code&gt;n + 1&lt;/code&gt;) - сахар для &lt;code&gt;S n&lt;/code&gt;. Вот, например, как этот сахар используется в определении функции &lt;code&gt;(+)&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
(+) :: Nat -&amp;gt; Nat -&amp;gt; Nat
0 + m = m                   -- аналогично Z + m = m
(n + 1) + m = (n + m) + 1   -- аналогично (S n) + m = S (n + m)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итак, нашему тайпчекеру надо проверить тип функции &lt;code&gt;append&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Для первой части определения вроде бы всё просто (на самом деле нет, но мы это рассмотрим дальше). Из &lt;code&gt;[]&lt;/code&gt; мы сопоставляем типы &lt;code&gt;List a n&lt;/code&gt; и &lt;code&gt;List b 0&lt;/code&gt;, находим, что наиболее общий тип, который входит в эти два - это &lt;code&gt;List a 0&lt;/code&gt; (подробности, как мы это делаем, неважны). &lt;code&gt;ys :: List a m&lt;/code&gt;, а значит, нам надо убедиться, что результат (&lt;code&gt;ys&lt;/code&gt; справа) имеет тип &lt;code&gt;List a (0 + m)&lt;/code&gt;. Для этого мы должны доказать, что &lt;code&gt;List a m&lt;/code&gt; (выведенный тип выражения &lt;code&gt;ys&lt;/code&gt;) будет равен &lt;code&gt;List a (0 + m)&lt;/code&gt; (тип из сигнатуры). Разбирая конструкторы получим &lt;code&gt;m == 0 + m&lt;/code&gt;, а это равенство у нас уже есть в определении &lt;code&gt;(+)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Итак, вроде простая задача, но тут мы применили три приёма:&lt;br /&gt;1. Подстановка (&lt;code&gt;n == 0, m == n + m =&amp;gt; m == 0 + m&lt;/code&gt;)&lt;br /&gt;2. Разбор конструктора (декомпозиция? структурный декремент?)&lt;br /&gt;3. Подстановка из равенства из определения функции (частный случай пункта 1, но из-за него нам надо знать определения функций над типами во время компиляции)&lt;br /&gt;&lt;br /&gt;Пока не будем на этом останавливаться, поехали дальше.&lt;br /&gt;&lt;br /&gt;Вторая часть определения&lt;br /&gt;&lt;pre&gt;
append (x:xs) ys = x : (xs `append` ys)
&lt;/pre&gt;&lt;br /&gt;Откуда&lt;br /&gt;&lt;pre&gt;
x :: a
xs :: List a k
ys :: List a m
k + 1 == n
xs `append` ys :: List a (k + m)
x : (xs `append` ys) :: List a ((k + m) + 1)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итак, мы должны сравнить &lt;code&gt;List a (n + m) == List a ((k + m) + 1)&lt;/code&gt;&lt;br /&gt;1. &lt;code&gt;n + m == (k + m) + 1&lt;/code&gt; (разбор конструктора)&lt;br /&gt;2. &lt;code&gt;(k + 1) + m == (k + m) + 1&lt;/code&gt; (подстановка)&lt;br /&gt;3. &lt;code&gt;(k + m) + 1 == (k + m) + 1&lt;/code&gt; (подстановка из функции)&lt;br /&gt;&lt;br /&gt;Вроде бы пары приёмов - подстановки и разбора конструктора (эдакой эта-редукции уровня типов) нам хватает. На самом деле тут самое интересное. Допустим, что программист определил тип для append как &lt;code&gt;List a n -&amp;gt; List a m -&amp;gt; List a (m + n)&lt;/code&gt;. Т.е. рокировка &lt;code&gt;n&lt;/code&gt; и &lt;code&gt;m&lt;/code&gt;. Как тут будет проходить доказательство?&lt;br /&gt;&lt;br /&gt;Для первой части имеем (после вытаскивания из конструкторов)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;m == m + 0&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;А вот это доказать простой подстановкой уже не получается. Единственное, что пришло мне в голову использовать метод индукции. Проверяем для всех конструкторов типа &lt;code&gt;Nat&lt;/code&gt;, начиная с простых (нерекурсивных, т.к. это &lt;code&gt;data&lt;/code&gt; - они обязательно должны быть).&lt;br /&gt;&lt;br /&gt;Для &lt;code&gt;Z&lt;/code&gt;: &lt;code&gt;m == 0, 0 + 0 = 0&lt;/code&gt;. ОК&lt;br /&gt;Для &lt;code&gt;S&lt;/code&gt;: &lt;code&gt;m = k + 1&lt;/code&gt;&lt;br /&gt;1. &lt;code&gt;k + 1 == (k + 1) + 0&lt;/code&gt; (подстановка)&lt;br /&gt;2. &lt;code&gt;k + 1 == (k + 0) + 1&lt;/code&gt; (подстановка из функции)&lt;br /&gt;3. &lt;code&gt;k == k + 0&lt;/code&gt; (разбор конструктора)&lt;br /&gt;4. ОК (по индукции)&lt;br /&gt;&lt;br /&gt;С индукцией тоже могут быть проблемы, о которых надо подумать: много переменных в равенствах, много параметров в конструкторах.&lt;br /&gt;&lt;br /&gt;Тем не менее, мы получили три приёма - подстановка, разбор конструктора и индукция. Последние два, очевидно, никак не могут препятствовать проверке типа завершиться. Подстановка из функции - тоже, т.к. функции у нас терминируемы, только брать надо подстановки слева направо. Остаётся просто подстановка, из типа, выведенного из выражения и из типа, описанного программистом. Может ли здесь возникнуть такая ситуация, что в системе равенств будет присутствовать &lt;code&gt;n = m + 1&lt;/code&gt;, &lt;code&gt;m = n + 1&lt;/code&gt;? Если да, можем ли мы легко определять такие ситуации и грязно ругаться?&lt;br /&gt;&lt;br /&gt;В общем, резюмирую.&lt;br /&gt;&lt;br /&gt;Проверка типа заключается в доказательстве, что тип, описанный программистом является таким же или более конкретным, чем тип, выведенный из выражения в правой части. При доказательстве используются три приёма:&lt;br /&gt;1. подстановка&lt;br /&gt;2. разбор конструктора (может деструкция? надо в статьях посмотреть)&lt;br /&gt;3. индукция&lt;br /&gt;&lt;br /&gt;Проблемы возникают с подстановкой:&lt;br /&gt;1. Надо знать содержание функций, применяющихся в описании типа.&lt;br /&gt;2. Неясно как быть с подстановками, ведущими к нетерминируемости.&lt;br /&gt;&lt;br /&gt;По первому пункту: видимо, надо знать именно равенства, а не паттерн -&amp;gt; case, разбирать проще. Правда, не представляю, как это может выглядеть.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если у кого то есть материалы по теме, накидайте сюда плз - потом как руки дойдут обязательно прочту всё-всё-всё :-)</description>
  <comments>http://lomeo.livejournal.com/40707.html</comments>
  <category>haskell</category>
  <category>программирование</category>
  <category>типы</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/40666.html</guid>
  <pubDate>Wed, 23 Jan 2008 10:50:09 GMT</pubDate>
  <title>kind функционального типа</title>
  <link>http://lomeo.livejournal.com/40666.html</link>
  <description>&lt;pre&gt;
Prelude&amp;gt; :kind (-&amp;gt;)
(-&amp;gt;) :: ?? -&amp;gt; ? -&amp;gt; *
&lt;/pre&gt;</description>
  <comments>http://lomeo.livejournal.com/40666.html</comments>
  <category>haskell</category>
  <category>ghc</category>
  <category>почему</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/40317.html</guid>
  <pubDate>Fri, 18 Jan 2008 10:11:32 GMT</pubDate>
  <title>Дезинтегратор</title>
  <link>http://lomeo.livejournal.com/40317.html</link>
  <description>Брат прислал: &lt;a href=&quot;http://www.engadget.com/2008/01/16/meet-the-disintegrator-24-barrels-of-rubber-band-minigun-madnes/&quot;&gt;классная игрушка.&lt;/a&gt; 288 резинок - если не убьют, то закидают.&lt;br /&gt;&lt;br /&gt;Вот видео оттуда:&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id=&quot;7&quot; /&gt;</description>
  <comments>http://lomeo.livejournal.com/40317.html</comments>
  <category>здорово</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/40155.html</guid>
  <pubDate>Thu, 13 Dec 2007 08:45:13 GMT</pubDate>
  <title>почему я не хожу на выборы</title>
  <link>http://lomeo.livejournal.com/40155.html</link>
  <description>&lt;a href=&quot;http://www.lebed.com/2006/art4517.htm&quot;&gt;&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Н. А. &lt;/b&gt;- Спасибо, понятно. А скажите, эта власть - демократична, как Вы оцените? &lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;О. Д. &lt;/b&gt;- Куда уж демократичнее. Если, конечно, откинуть всякие сказки о демократии, якобы кто-то что-то решает, зайдя в кабинку для голосования. На самом деле кабинки существуют для того, чтобы население имело возможность туда заходить - торжественно, под звуки музыки. Это население должно надолго запоминать то, что они имели демократическую возможность поставить галочку в любом месте, где захотят. Это элемент стабилизации общественных процессов. Совершенно ясно, что экономика, крупный конкурентоспособный бизнес не могут пойти на такой великий риск - произвольное назначение менеджеров госаппарата, как бог на душу положит. Ни в одной западной стране нет такого произвола, а у нас на среднем уровне управления страной он некоторое время он был. Это сильно мешало власти и бизнесу. Теперь риск устранен, да и кадры отстоялись. &lt;/p&gt;&lt;/a&gt;</description>
  <comments>http://lomeo.livejournal.com/40155.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/39772.html</guid>
  <pubDate>Thu, 06 Dec 2007 11:57:36 GMT</pubDate>
  <title>Не могу доказать :-(</title>
  <link>http://lomeo.livejournal.com/39772.html</link>
  <description>Небольшое вступление.&lt;br /&gt;&lt;br /&gt;Есть такой модуль Control.Applicative, в котором определён класс Applicative&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
class Functor a =&amp;gt; Applicative a where
    pure :: a -&amp;gt; f a
    &amp;lt;*&amp;gt; :: f (a -&amp;gt; b) -&amp;gt; f a -&amp;gt; f b
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;т.е. он чуть шире &lt;code&gt;Functor&lt;/code&gt; (за счёт &lt;code&gt;pure&lt;/code&gt;), и чуть уже &lt;code&gt;Monad&lt;/code&gt;. Золотая середина - полезно, когда нам от монад нужен только &lt;code&gt;return&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Так вот есть такой метод:  &lt;code&gt;&amp;lt;**&amp;gt; :: f a -&amp;gt; f (a -&amp;gt; b) -&amp;gt; f b&lt;/code&gt;, который по сути представляет собой перевёрнутый &lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt;.&lt;br /&gt;Однако его реализация в исходниках такая:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
(&amp;lt;**&amp;gt;) = liftA2 (flip ($))
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Я попытался привести это выражение к &lt;code&gt;flip (*)&lt;/code&gt; и вот что у меня получилось:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
liftA2 (flip ($))
\a b -&amp;gt; (flip ($)) &amp;lt;$&amp;gt; a &amp;lt;*&amp;gt; b -- definition of liftA2
\a b -&amp;gt; (fmap (flip ($)) a) &amp;lt;*&amp;gt; b -- definition of l&amp;lt;$&amp;gt;
\a b -&amp;gt; (pure (flip ($)) &amp;lt;*&amp;gt; a) &amp;lt;*&amp;gt; b -- Functor instance rule: f `fmap` a = pure f &amp;lt;*&amp;gt; a
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В это месте у меня затык. Предположив, что &lt;code&gt;a = pure a&apos;&lt;/code&gt; можно получить&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
\a&apos; b -&amp;gt; (pure (flip ($)) &amp;lt;*&amp;gt; pure a&apos;) &amp;lt;*&amp;gt; b -- a = pure a&apos;
\a&apos; b -&amp;gt; pure (flip ($) a&apos;) &amp;lt;*&amp;gt; b -- homomorphism rule: pure f &amp;lt;*&amp;gt; pure x = pure (f x)
\a&apos; b -&amp;gt; pure ($ a&apos;) &amp;lt;*&amp;gt; b -- flip ($) x = ($ x)
\a&apos; b -&amp;gt; b &amp;lt;*&amp;gt; pure a&apos; -- interchange rule: u &amp;lt;*&amp;gt; pure y = pure ($ y) &amp;lt;*&amp;gt; u
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ну и возвращая &lt;code&gt;a&lt;/code&gt; на место вместо &lt;code&gt;a&apos;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
\a b -&amp;gt; b &amp;lt;*&amp;gt; a
flip (&amp;lt;*&amp;gt;)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ЧТД. Но! Я совершенно не уверен, что могу делать допущение подобное &lt;code&gt;a = pure a&apos;&lt;/code&gt;.&lt;br /&gt;Кто нибудь подскажет, как выровнять доказательство?&lt;br /&gt;</description>
  <comments>http://lomeo.livejournal.com/39772.html</comments>
  <category>haskell</category>
  <category>доказательство</category>
  <category>математика</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/39606.html</guid>
  <pubDate>Tue, 06 Nov 2007 09:49:26 GMT</pubDate>
  <title>FYI I am a spy ;-)</title>
  <link>http://lomeo.livejournal.com/39606.html</link>
  <description>Давно ничего не писал, обновлю журнал.&lt;br /&gt;&lt;br /&gt;Вот парень классно прикололся.&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id=&quot;6&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Пробежал позавчера HL2E2. Атака страйдеров отражается так - убиваешь охотников машиной, при этом у тебя скорее всего будут тяжёлые потери, но охотник валится сразу; либо гравипушкой закидываешь их какашками - так ты более мобилен и сил для игр и роста остаётся гораздо гораздее. Дальше просто - бомбу-липучку к пузу и биг-бада-бум!! Ах да! Ещё я бомб вокруг себя побросал, чтобы их не ждать в телепорте.</description>
  <comments>http://lomeo.livejournal.com/39606.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/39400.html</guid>
  <pubDate>Mon, 15 Oct 2007 10:47:19 GMT</pubDate>
  <title>Горилла в чувствах-с</title>
  <link>http://lomeo.livejournal.com/39400.html</link>
  <description>Просто балдею. Уже несколько раз поглядел.&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id=&quot;5&quot; /&gt;</description>
  <comments>http://lomeo.livejournal.com/39400.html</comments>
  <category>здорово</category>
  <category>youtube</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/38961.html</guid>
  <pubDate>Thu, 12 Jul 2007 08:51:56 GMT</pubDate>
  <title>Опять про Monadability</title>
  <link>http://lomeo.livejournal.com/38961.html</link>
  <description>Допустим у нас есть тип (X a), где X ::= T x y z ... Тут важно, что &quot;a&quot; последнее.&lt;br /&gt;Тогда если &quot;a&quot; хотя бы в одном конструкторе данных стоит слева от стрелки, то этот тип нельзя сделать функтором (instance Functor) так, чтобы соблюдались законы над функторами, нес па?</description>
  <comments>http://lomeo.livejournal.com/38961.html</comments>
  <category>haskell</category>
  <category>типы</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/38825.html</guid>
  <pubDate>Wed, 04 Jul 2007 14:57:27 GMT</pubDate>
  <title>Кстати!</title>
  <link>http://lomeo.livejournal.com/38825.html</link>
  <description>Для equational reasoning в &lt;a href=&quot;http://haskell.org/&quot;&gt;Haskell&lt;/a&gt; можно (иногда нужно) пользоваться &lt;a href=&quot;http://www.haskell.org/ghc/docs/latest/html/users_guide/rewrite-rules.html&quot;&gt;GHC Rules&lt;/a&gt; (На &lt;a href=&quot;http://www.haskell.org/haskellwiki/GHC/Using_Rules&quot;&gt;Haskellwiki&lt;/a&gt;), чтобы написанное было читабельным и maintainable, а скомпилированное эффективным. А для нахождения нужных правил можно воспользоваться &lt;a href=&quot;http://citeseer.ist.psu.edu/wadler89theorems.html&quot;&gt;Theorem for Free&lt;/a&gt;. Например, его &lt;a href=&quot;http://haskell.as9x.info/ft.html&quot;&gt;автоматической выводилкой&lt;/a&gt;. Или использовать free / ft команды &lt;a href=&quot;http://www.cse.unsw.edu.au/~dons/lambdabot.html&quot;&gt;lambdabot&lt;/a&gt;-а.&lt;br /&gt;&lt;br /&gt;К сожалению, что нибудь более-менее автоматического для типов, отличных от стандартных, я найти не могу. Остаётся или выводить правила руками, или строить по аналогии со стандартными,  а затем проверять на корректность.&lt;br /&gt;&lt;br /&gt;Это я всё мечтаю. Нарисовал нужные типы данных, сформировал по ним типы функций для работы над ними, автоматически построил их реализацию, автоматически построил правила, выбрал нужные для оптимизации. А дальше работаешь легко и непринуждённо. Это идеал, разумеется. Но я уверен, что частично эту работу можно автоматизировать. Типа того, что при доказательстве Coq&apos;ом ему надо указывать стратегии, так же и здесь при реализации тела функции надо направлять &quot;думатель&quot;.&lt;br /&gt;&lt;br /&gt;Это вообще возможно? А то у меня каша в голове.</description>
  <comments>http://lomeo.livejournal.com/38825.html</comments>
  <category>оптимизация</category>
  <category>haskell</category>
  <category>программирование</category>
  <category>equational reasoning</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/38545.html</guid>
  <pubDate>Tue, 26 Jun 2007 13:29:52 GMT</pubDate>
  <title>Токипона: ссылки</title>
  <link>http://lomeo.livejournal.com/38545.html</link>
  <description>&lt;a href=&quot;http://www.tokipona.org&quot;&gt;Официальный сайт токипоны&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Уроки токипоны:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://ru.wikibooks.org/wiki/%D0%A2%D0%BE%D0%BA%D0%B8%D0%BF%D0%BE%D0%BD%D0%B0&quot;&gt;&lt;sup&gt;[RUS]&lt;/sup&gt;Токипона на wikibooks (&lt;a href=&quot;http://bknight0.myweb.uga.edu/toki/lesson/lesson0.html&quot;&gt;переведённые от jan Pije&lt;/a&gt;)&lt;/a&gt;. Классика. Учитесь по этим урокам.&lt;br /&gt;&lt;a href=&quot;http://archive.diary.ru/~Lekalo/?order=frombegin&quot;&gt;&lt;sup&gt;[RUS]&lt;/sup&gt;Уроки от jan Lekalo&lt;/a&gt;. Это даже не уроки. Парень учит токипону и по ходу обучения рассказывает про неё. По моему первый обучающий ресурс на русском.&lt;br /&gt;&lt;a href=&quot;http://www.lingvisto.org/tokipona/index.html&quot;&gt;&lt;sup&gt;[RUS]&lt;/sup&gt;Уроки на лингвисто от jan Eliki&lt;/a&gt;. Неоконченные, но проникнутые духом токипоны. Есть &lt;a href=&quot;http://www.lingvisto.org/tokipona/toki_pona1.jpg&quot;&gt;красивая азбука&lt;/a&gt; от Lament.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Общества, группы и т.д.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://tokipona.wikia.com/wiki/lipu_lawa&quot;&gt;WIKI на TP&lt;/a&gt;.&lt;br /&gt;&lt;a href=&quot;http://community.livejournal.com/tokipona&quot;&gt;TP на LJ&lt;/a&gt;.&lt;br /&gt;&lt;a href=&quot;http://community.livejournal.com/ru_tp&quot;&gt;&lt;sup&gt;[RUS]&lt;/sup&gt;TP на русском LJ&lt;/a&gt;.&lt;br /&gt;&lt;a href=&quot;http://groups.yahoo.com/group/tokipona/&quot;&gt;TP группа на yahoo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Персональные странички&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bknight0.myweb.uga.edu/toki/&quot;&gt;jan Pije&lt;/a&gt;. Тексты, картинки, музыка. Есть сценарий &quot;В поисках священного Грааля&quot; Монти Пайтона.&lt;br /&gt;&lt;a href=&quot;http://bellsouthpwp.net/j/i/jimhenry1973/conlang/tokipona/tokipona.htm&quot;&gt;jan Jakopo&lt;/a&gt;. Частота употребления звуков. Панграммы.&lt;br /&gt;&lt;a href=&quot;http://www.freewebs.com/silverwings_88/&quot;&gt;jan Ke&lt;/a&gt;. Гимны, молитвы.&lt;br /&gt;Потом допишу, неохота вспомнить.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Письменность&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bknight0.myweb.uga.edu/toki/tengwar/tengwar.html&quot;&gt;Тенгвар&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://community.livejournal.com/tokipona/15917.html&quot;&gt;Скоропись&lt;/a&gt; или что то вроде этого. Не помню.&lt;br /&gt;&lt;a href=&quot;http://www.tokipona.bravehost.com/korean.html&quot;&gt;Хангыл.&lt;/a&gt; Самое симпатичное по мне. &lt;a href=&quot;http://www.tokipona.bravehost.com/koreansamples.html&quot;&gt;Сэмпл&lt;/a&gt;.&lt;br /&gt;&lt;a href=&quot;http://www.theiling.de/schrift/tokipona.html&quot;&gt;Иероглифы&lt;/a&gt;. Прикольно.&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/027/0e.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/021/f2.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/021/b4.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/026/3a.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/021/e5.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/022/22.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/021/b4.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/026/39.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/021/e5.gif&quot;&gt;&lt;img src=&quot;http://www.theiling.de/schrift/00/char3/glyphs/tp/030/027/0e.gif&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://asemaen.site.voila.fr/tokipona/list.html&quot;&gt;Иероглифы неоконченное&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Послушать, посмотреть&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://video.google.com/videoplay?docid=-4972178609362470960&amp;amp;q=toki+pona&quot;&gt;&lt;span class=&apos;ljuser&apos; lj:user=&apos;shinan&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://shinan.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://p-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://shinan.livejournal.com/&apos;&gt;&lt;b&gt;shinan&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; с 9:22 до 13:41 прикольно так болтает.&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://bknight0.myweb.uga.edu/toki/music/music.html&quot;&gt;Песенки от Pije&lt;/a&gt;&lt;br /&gt;Ещё где то лежало &quot;mama pi mi mute o&quot;. Что то не найду сходу.</description>
  <comments>http://lomeo.livejournal.com/38545.html</comments>
  <category>токипона</category>
  <category>утиль</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/38361.html</guid>
  <pubDate>Mon, 25 Jun 2007 09:05:03 GMT</pubDate>
  <title>mi jo e jan lili</title>
  <link>http://lomeo.livejournal.com/38361.html</link>
  <description>А у #tokipona дня три такой топик:&lt;br /&gt;&lt;br /&gt;jan Lome li jan pi toki pona. ona li jo e jan lili sin. ona li mije. pona!&lt;br /&gt;&lt;br /&gt;приятно чёрт возьми :)</description>
  <comments>http://lomeo.livejournal.com/38361.html</comments>
  <category>здорово</category>
  <category>токипона</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/38056.html</guid>
  <pubDate>Fri, 22 Jun 2007 06:55:37 GMT</pubDate>
  <link>http://lomeo.livejournal.com/38056.html</link>
  <description>Это ж надо умудриться родиться в самую короткую ночь в году!&lt;br /&gt;Теперь у меня два рака. Когда подрастут, буду пить пиво с раками.</description>
  <comments>http://lomeo.livejournal.com/38056.html</comments>
  <category>лытдыбр</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/37837.html</guid>
  <pubDate>Mon, 18 Jun 2007 13:13:27 GMT</pubDate>
  <title>Опять про паттерн матчинг</title>
  <link>http://lomeo.livejournal.com/37837.html</link>
  <description>На &lt;a href=&quot;http://rsdn.ru/&quot;&gt;RSDN&lt;/a&gt; технические работы.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Хотел зацепиться в очередном флейме &quot;ФВП vs паттерн-матчинг&quot;. Ребята показывали насколько ПМ сокращает код и проясняет его по сравнению с обычным императивным. А я пытался показать, насколько комбинаторы сокращают код и проясняют его по сравнению с ПМ. Ну и заодно показал пример как на основе equational reasoning можно улучшить код.&lt;br /&gt;&lt;br /&gt;Продублирую, мне это было интересно - может ещё кому нибудь понравится.&lt;br /&gt;&lt;br /&gt;Изначально, стояла такая задача (если я её верно понял):&lt;br /&gt;&lt;br /&gt;Имеются вектор и двумерная матрица, надо перемножить вектор на столбцы матрицы, а затем сложить каждый столбец в одно число. Получим список чисел, количество которых равно количеству столбцов исходной матрицы, ну или длине строки матрицы.&lt;br /&gt;&lt;br /&gt;Вообще то это подзадача, вторая подзадача там была - получение &lt;code&gt;init&lt;/code&gt; списка, его тоже зачем то решали через ПМ (в Немерле нет аналога &lt;code&gt;init&lt;/code&gt;?).&lt;br /&gt;&lt;br /&gt;Вот решение на Немерле с использованием паттерн-матчинга:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
def GetDx(_, _)
{
| ([ck], [cf]) =&amp;gt;
    cf.Map(_ * ck)
 
| (ck :: klast, cf :: flast) =&amp;gt;
    def incDx = GetDx(klast, flast);
    cf.MapI((i, f) =&amp;gt; f * ck + incDx[i])

| _ =&amp;gt; throw Exception();//Если списки разной длинны.
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Удалены участки, относящиеся к вычислению &lt;code&gt;init&lt;/code&gt;. &lt;code&gt;MapI&lt;/code&gt; - это &lt;code&gt;map&lt;/code&gt; с дополнительным параметром - индексом. Матрица в решении - это не список списков, как у меня на Haskell, а список массивов, так что &lt;code&gt;MapI&lt;/code&gt; применим, правда, по мне всё таки &lt;code&gt;zipWith (\x y -&amp;gt; ck * x + y) cf incDx&lt;/code&gt; понятнее.&lt;br /&gt;&lt;br /&gt;Вот первое пришедшее мне в голову решение на Haskell.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
getDx ks fs = map sum $ transpose $ zipWith (\x -&amp;gt; map (x*)) ks fs
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;zipWith (\x -&amp;gt; map (x*)) ks fs&lt;/code&gt; - переменожаем &lt;code&gt;ks&lt;/code&gt; на столбцы &lt;code&gt;fs&lt;/code&gt;&lt;br /&gt;&lt;code&gt;map sum . transpose&lt;/code&gt; - суммируем столбцы&lt;br /&gt;&lt;br /&gt;Плюс, помимо краткости и выразительности: мы можем легко сделать преобразования.&lt;br /&gt;&lt;br /&gt;Сделать их можно, используя три закона&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
1. (f . g) . h == f (g . h)

2. map f . map g == map (f . g)

3. transpose . zipWith (map . f) xs == map (zipWith f xs) . transpose
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;а также эта-редукцию и замену ($) на (.)&lt;br /&gt;&lt;br /&gt;Всю цепочку показывать не буду - она тривиальна. Вот результат:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
map (sum . zipWith (*) ks) $ transpose fs
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;По моему короче, эффективнее и понятнее. Внутри сразу видно маленькую чётко очерченную подзадачку &lt;code&gt;(sum . zipWith (*) ks)&lt;/code&gt; - вектор на вектор, результат сложить. В случае паттерн-матчинга эта подзадачка раскидана по всему коду; сделать преобразование, подобное приведённому, гораздо сложнее.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S. А ещё я сегодня видел в метро парня, читавшего распечатку &quot;Знакомство с языком Haskell&quot; или что то в этом духе ;-)&lt;br /&gt;&lt;br /&gt;P.P.S. А ещё я подумал, что изобрёл слово &quot;индексикация&quot; как перевод indexitis (болезнь использования (!!) в Haskell), а оно оказывается &lt;a href=&quot;http://www.yandex.ru/yandsearch?text=%E8%ED%E4%E5%EA%F1%E8%EA%E0%F6%E8%FF&quot;&gt;существует реально&lt;/a&gt; и означает совсем-совсем другое :-(</description>
  <comments>http://lomeo.livejournal.com/37837.html</comments>
  <category>паттерн-матчинг</category>
  <category>haskell</category>
  <category>программирование</category>
  <category>функции высшего порядка</category>
  <category>equational reasoning</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/37459.html</guid>
  <pubDate>Fri, 08 Jun 2007 13:23:04 GMT</pubDate>
  <title>Про лямбду, как всегда.</title>
  <link>http://lomeo.livejournal.com/37459.html</link>
  <description>Удивительно быстро прошёл Episode One&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id=&quot;3&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Жду - не дождусь Episode Two&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id=&quot;4&quot; /&gt;&lt;br /&gt;&lt;br /&gt;А ещё я всё это могу играть, потому что у меня сгорел компьютер, и я взял новый.</description>
  <comments>http://lomeo.livejournal.com/37459.html</comments>
  <category>здорово</category>
  <category>игры</category>
  <category>youtube</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/37340.html</guid>
  <pubDate>Mon, 21 May 2007 11:50:05 GMT</pubDate>
  <title>Задачка со свёрткой</title>
  <link>http://lomeo.livejournal.com/37340.html</link>
  <description>Читал статью Bernie Pope &quot;Getting a Fix from the Right Fold&quot; из &lt;a href=&quot;http://www.haskell.org/sitewiki/images/1/14/TMR-Issue6.pdf&quot;&gt;The Monad. Reader Issue 6&lt;/a&gt;. В ней решается задачка о написании &lt;code&gt;dropWhile&lt;/code&gt; через &lt;code&gt;foldr&lt;/code&gt;. В частности, эта задачка решалась в &lt;a href=&quot;http://citeseer.ist.psu.edu/301385.html&quot;&gt;Graham Hutton &quot;A Tutorial on the Universality and Expressiveness of Fold&quot;&lt;/a&gt; через таплы.&lt;br /&gt;&lt;br /&gt;У меня удивительно быстро получилось решить эту задачку. Решение было эквивалентным решению 2 в статье.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Смысл в том, чтобы породить функцию с помощью &lt;code&gt;foldr&lt;/code&gt;, которую мы уже затем применим к списку. Функция или вернёт тот же список или обрежет у него хвост, т.е. &lt;code&gt;id (tail (tail (tail (tail (tail xs)))))&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
myDropWhile p xs = foldr f id xs xs
    where
        f x g xs | p x       = g (tail xs)
                 | otherwise = xs
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;К сожалению, это решение неоптимально, т.к. функция, порожденная foldr (та самая к которой мы второй раз применяем список), зависит от количества сброшенных элементов. Pope предлагает решение, которое вместо порождения цепочки функций, попеременно применяет функцию к списку. Для этого достаточно, чтобы &lt;code&gt;tail&lt;/code&gt; был вызван раньше &lt;code&gt;g&lt;/code&gt;, который является рекурсивным вызовом &lt;code&gt;foldr&lt;/code&gt;. С помощью паттерн-матчинга (который как известно неленив) мы получим:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
myDropWhile p xs = foldr f id xs xs
    where
        f x g xs@(_:ys) | p x       = g ys
                        | otherwise = xs
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Я бы не догадался. Мне пришлось бы расписывать пример, как проходит вычисление, чтобы до этого дойти. Как он это сообразил, не пойму... Он то, конечно, говорит, мол, Эврика! и всё такое...&lt;br /&gt;</description>
  <comments>http://lomeo.livejournal.com/37340.html</comments>
  <category>оптимизация</category>
  <category>паттерн-матчинг</category>
  <category>haskell</category>
  <category>задачка</category>
  <category>программирование</category>
  <category>функции высшего порядка</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/37007.html</guid>
  <pubDate>Thu, 17 May 2007 11:54:34 GMT</pubDate>
  <title>Team Fortress 2 (персонажи)</title>
  <link>http://lomeo.livejournal.com/37007.html</link>
  <description>&lt;lj-embed id=&quot;2&quot; /&gt;</description>
  <comments>http://lomeo.livejournal.com/37007.html</comments>
  <category>здорово</category>
  <category>игры</category>
  <category>youtube</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/36664.html</guid>
  <pubDate>Thu, 17 May 2007 11:53:04 GMT</pubDate>
  <title>Team Fortress 2</title>
  <link>http://lomeo.livejournal.com/36664.html</link>
  <description>&lt;lj-embed id=&quot;1&quot; /&gt;</description>
  <comments>http://lomeo.livejournal.com/36664.html</comments>
  <category>здорово</category>
  <category>игры</category>
  <category>youtube</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/36534.html</guid>
  <pubDate>Mon, 07 May 2007 14:25:07 GMT</pubDate>
  <title>Functional pearls</title>
  <link>http://lomeo.livejournal.com/36534.html</link>
  <description>Недавно на &lt;a href=&quot;http://lambda-the-ultimate.org/node/2229&quot;&gt;LTU&lt;/a&gt; проходила ссылка на &lt;a href=&quot;http://www.haskell.org/haskellwiki/Research_papers/Functional_pearls&quot;&gt;Functional Pearls&lt;/a&gt;. Наконец то я до неё добрался и начал читать &lt;a href=&quot;http://icfp06.cs.uchicago.edu/bird-talk.pdf&quot;&gt;Richard Bird. How to Write a Functional Pearl&lt;/a&gt;. Понравившиеся, по исключительно субъективным причинам, моменты:&lt;br /&gt;&lt;br /&gt;В одном из советов о том, как писать, Bird пишет: &lt;q&gt;&lt;i&gt;&quot;Find an author whose style you admire and copy it (my personal favourites are Martin Gardner and Don Knuth).&quot;&lt;/i&gt;&lt;/q&gt;. Порадовало, собственно, наличие Мартина Гарднера в образцах подражания.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Во вторых, в примере решалки судоку, в коде не используются индексы для получения значений из матрицы. Когда я учил Haskell, мы с товарищем как раз писали такую решалку. В качестве одного из критерия сравнения декларативного и императивного подхода я тогда как раз понял то, что использование &lt;code&gt;(!!)&lt;/code&gt;, &lt;code&gt;map ... [1..n]&lt;/code&gt; и тому подобное - это просто-напросто императивный код на функциональном языке. Избавляясь от подобного подхода, я сократил (и ускорил) программу. Собственно тогда я более-менее чётко понял, что такое декларативность и почувствовал, что она даёт.&lt;br /&gt;&lt;br /&gt;Bird пишет об этой ситуации (с матрицей судоку) так:&lt;br /&gt;&lt;br /&gt;&lt;q&gt;&lt;i&gt;Instead of thinking about coordinate systems, and doing arithmetic on subscripts to extract information about rows, columns and boxes, we have gone for denitions of these functions that treat the matrix as a complete entity in itself.&lt;br /&gt;&lt;br /&gt;Geraint Jones has aptly called this style &lt;b&gt;Wholemeal Programming&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Wholemeal programming is good for you: it helps to prevent a disease called indexitis, and encourages lawful program construction.&lt;/i&gt;&lt;/q&gt;&lt;br /&gt;&lt;br /&gt;Слово очень понравилось. На &lt;a href=&quot;http://rsdn.ru/&quot;&gt;РСДН&lt;/a&gt;, например, замечен неоднократный оживляж по поводу паттерн-матчинга. Его превозносят, считая одной из основных черт функционального программирования. Не хочется его принижать - ПМ, действительно, вещь замечательная. Но у неё есть и недостатки, первый и главный из которых - это отсутствие сокрытия данных. Чуть поменялась структура - и вперёд по всему коду менять паттерны! Я стараюсь использовать ПМ для типов модуля внутри этого же модуля, а снаружи использовать комбинаторы над этим типом. И вот поэтому слово Wholemeal Programming мне очень нравится ;-)&lt;br /&gt;&lt;br /&gt;Ну, и вообще насчёт статьи - метод, который применяется для разработки программы, очень интересен, что то вроде ручного fusion.&lt;br /&gt;</description>
  <comments>http://lomeo.livejournal.com/36534.html</comments>
  <category>здорово</category>
  <category>паттерн-матчинг</category>
  <category>программирование</category>
  <category>equational reasoning</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/36306.html</guid>
  <pubDate>Thu, 03 May 2007 14:17:37 GMT</pubDate>
  <title>Натуральные числа и Нео</title>
  <link>http://lomeo.livejournal.com/36306.html</link>
  <description>Тут подумал, что &lt;span class=&apos;ljuser&apos; lj:user=&apos;thesz&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://thesz.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://p-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://thesz.livejournal.com/&apos;&gt;&lt;b&gt;thesz&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; в рамках&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;data Nat = Z | S Nat&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;читается как The (S Z), т.е. The One.</description>
  <comments>http://lomeo.livejournal.com/36306.html</comments>
  <category>упс</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/36012.html</guid>
  <pubDate>Wed, 02 May 2007 12:41:20 GMT</pubDate>
  <title>Давно я ничего не писал, поэтому напишу хоть что нибудь.</title>
  <link>http://lomeo.livejournal.com/36012.html</link>
  <description>Одной из поразивших меня вещей в ФП был Curry-Howard изоморфизм.</description>
  <comments>http://lomeo.livejournal.com/36012.html</comments>
  <category>здорово</category>
  <category>программирование</category>
  <category>типы</category>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://lomeo.livejournal.com/35674.html</guid>
  <pubDate>Tue, 10 Apr 2007 10:23:19 GMT</pubDate>
  <title>Вывод типов всегда завершается, говорите?</title>
  <link>http://lomeo.livejournal.com/35674.html</link>
  <description>Вот здесь у меня висит на выводе типа myFix:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
&lt;b&gt;newtype&lt;/b&gt; Fun a = Fun (Fun a -&amp;gt; a)
 
fun x@(Fun f) = f x
 
myFix = fun (Fun fun)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Запускал в GHCi 6.6</description>
  <comments>http://lomeo.livejournal.com/35674.html</comments>
  <category>haskell</category>
  <category>непонятно</category>
  <lj:security>public</lj:security>
</item>
</channel>
</rss>
