<?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/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:ru_lambda</id>
  <title>Лямбда - функциональное программирование</title>
  <subtitle>Лямбда - функциональное программирование</subtitle>
  <author>
    <name>Лямбда - функциональное программирование</name>
  </author>
  <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom"/>
  <updated>2012-05-28T14:49:32Z</updated>
  <lj:journal userid="9122396" username="ru_lambda" type="community"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://ru-lambda.livejournal.com/data/atom" title="Лямбда - функциональное программирование"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:137701</id>
    <author>
      <name>tiny_haskeller</name>
    </author>
    <lj:poster user="tiny_haskeller" userid="19135445"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/137701.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=137701"/>
    <title>ru_lambda @ 2012-05-28T17:47:00</title>
    <published>2012-05-28T14:48:00Z</published>
    <updated>2012-05-28T14:49:32Z</updated>
    <content type="html">Есть у меня некие типы данных, условно говоря, такие&lt;br /&gt;&lt;br /&gt;data T1 = Q | B String | R | ........&lt;br /&gt;data T2 = Left | Right | Potato Int | .....&lt;br /&gt;data TT = TT T1 T2 &lt;br /&gt;&lt;br /&gt;Нужен мне для работы тип ТТ, но в силу специфики предметной области в 99% процентов случаев это будет одна из 20-30 комбинаций, поэтому мне удобно завести функции вида&lt;br /&gt;&lt;br /&gt;f1 = TT Q Left&lt;br /&gt;f2 = TT Q (Potato 7)&lt;br /&gt;f3 = TT R Right&lt;br /&gt;...&lt;br /&gt;f20 = TT (B "Last One") (Potato 0)&lt;br /&gt;&lt;br /&gt;чтобы количество текста сократить, тем более, что все эти f1 - f20 - устоявшиеся и всем известные названия; кроме того хочется мне при обработке типа ТТ повторно их использовать, чтобы не писать вновь 20 раз&lt;br /&gt;&lt;br /&gt;process (TT Q Left) = ...&lt;br /&gt;process (TT Q (Potato 7)) = ...&lt;br /&gt;process (TT R Right) = ...&lt;br /&gt;...&lt;br /&gt;process (TT (B "Last One") (Potato 0))) = ...&lt;br /&gt;process (TT a b) = universalProcessing a b &lt;br /&gt;&lt;br /&gt;а иметь нечто в духе&lt;br /&gt;&lt;br /&gt;process (id -&amp;gt; f1) = ...&lt;br /&gt;process (id -&amp;gt; f2) = ...&lt;br /&gt;process (id -&amp;gt; f3) = ...&lt;br /&gt;&lt;br /&gt;и так далее.&lt;br /&gt;&lt;br /&gt;Как такое можно сделать?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:137356</id>
    <author>
      <name>Алексей Головко</name>
    </author>
    <lj:poster user="miserakl" userid="14154060"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/137356.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=137356"/>
    <title>Coq.</title>
    <published>2012-05-13T07:11:13Z</published>
    <updated>2012-05-13T07:11:13Z</updated>
    <content type="html">Как доказать в Coq &lt;code&gt;1&amp;lt;=0 -&amp;gt; False&lt;/code&gt;?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:137095</id>
    <author>
      <name>hanmaudziro</name>
    </author>
    <lj:poster user="hanmaudziro" userid="16773215"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/137095.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=137095"/>
    <title>Курочки невидимки</title>
    <published>2012-04-28T10:34:10Z</published>
    <updated>2012-04-28T10:34:10Z</updated>
    <content type="html">читаю Fun with type functions; Oleg Kislov, SPJ&lt;br /&gt;дошел до раздела про мемоизацию, не совсем понял как она работает и стал проверять на примерчике&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;class Memo a where&amp;nbsp;&lt;br /&gt;&amp;nbsp; data Table a :: * -&amp;gt; *&lt;br /&gt;&amp;nbsp; toTable :: (a -&amp;gt; w) -&amp;gt; Table a w&lt;br /&gt;&amp;nbsp; fromTable :: Table a w -&amp;gt; (a -&amp;gt; w)&lt;br /&gt;&lt;br /&gt;instance Memo Bool where&lt;br /&gt;&amp;nbsp; data Table Bool w = TBool w w deriving Show&lt;br /&gt;&amp;nbsp; toTable f = TBool (f True) (f False)&lt;br /&gt;&amp;nbsp; fromTable (TBool x y) b = if b then x else y&lt;br /&gt;&lt;br /&gt;fact 0 = 1&lt;br /&gt;fact n = n* fact (n-1)&lt;br /&gt;&lt;br /&gt;f &amp;nbsp;:: Bool -&amp;gt; Int&amp;nbsp;&lt;br /&gt;f True &amp;nbsp;= fact 10008&lt;br /&gt;f False = fact 100&lt;br /&gt;&lt;br /&gt;g :: Bool -&amp;gt; Int&lt;br /&gt;g = fromTable ( toTable f)&lt;br /&gt;&lt;br /&gt;gg = g True + g True&amp;nbsp;&lt;br /&gt;&lt;br /&gt;выполняем gg и получаем 0&lt;br /&gt;&lt;br /&gt;у меня два вопроса&lt;br /&gt;1) если закомментарить определение типа для f и g, то gg выдаст результат отличный от нуля. А если раскомментарить = 0.&lt;br /&gt;&amp;nbsp; &amp;nbsp;Почему?&lt;br /&gt;2) Авторы утверждают что gg выполнится в 2 раза быстрее, чем f True + f True. С чего бы это? я не вижу где кэширется результат выполнения g первый раз&lt;br /&gt;&lt;br /&gt;&lt;a name='cutid1-end'&gt;&lt;/a&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:136725</id>
    <author>
      <name>Алексеев Александр</name>
    </author>
    <lj:poster user="afiskon" userid="17302724"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/136725.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=136725"/>
    <title>Вышел русский перевод книги "Learn You a Haskell for Great Good!"</title>
    <published>2012-04-04T06:58:00Z</published>
    <updated>2012-04-04T06:58:00Z</updated>
    <content type="html">В русском переводе книга называется &amp;quot;Изучай Haskell во имя добра!&amp;quot;. Если кто-нибудь не в курсе, это замечательный учебник по Haskell, лучше вы скорее всего нигде не найдете, тем более в печатном варианте и на русском языке.&lt;br /&gt;&lt;br /&gt;Заказ можно оформить тут: &lt;a href='http://www.dmk-press.ru/catalog/computer/prog_lang/izuchay_haskell_vo_imya_dobra/' rel='nofollow'&gt;http://www.dmk-press.ru/catalog/computer/prog_lang/izuchay_haskell_vo_imya_dobra/&lt;/a&gt; или на Озоне. На Озоне говорится, что книга поступит 13-го апреля. Цена - 389 рублей.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:136654</id>
    <author>
      <name>Anton Salikhmetov</name>
    </author>
    <lj:poster user="codedot" userid="11832244"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/136654.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=136654"/>
    <title>Безусловный интерпретатор LISP на LISP</title>
    <published>2012-02-27T08:32:46Z</published>
    <updated>2012-03-08T05:07:45Z</updated>
    <content type="html">Здравствуйте!&lt;br /&gt;&lt;br /&gt;У меня возникла задача, которую можно сформулировать целиком в терминах языка LISP.&lt;br /&gt;&lt;br /&gt;Требуется найти такие функции &lt;code&gt;encode&lt;/code&gt;, &lt;code&gt;decode&lt;/code&gt; и &lt;code&gt;reduce&lt;/code&gt;, что&lt;br /&gt;&lt;br /&gt;&lt;code&gt;(decode (reduce … (reduce (encode (quote expr))) … ))&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;для некоторого конечного количества применений &lt;code&gt;reduce&lt;/code&gt; является результатом интерпретации выражения &lt;code&gt;expr&lt;/code&gt;, в котором можно ограничиться переменными и &lt;code&gt;lambda&lt;/code&gt; одного аргумента, причем возвращаемое значение &lt;code&gt;encode&lt;/code&gt; — это рекурсивное S-выражение &lt;code&gt;memory&lt;/code&gt; с циклами без атомов, а функция &lt;code&gt;reduce&lt;/code&gt; должна иметь следующий вид:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(lambda (memory)
	(set (c[ad]*r memory) (c[ad]*r memory))
	(set (c[ad]*r memory) (c[ad]*r memory))

	…

	(set (c[ad]*r memory) (c[ad]*r memory))

	memory
)&lt;/pre&gt;&lt;br /&gt;Был бы признателен за помощь в решении данной задачи.&lt;br /&gt;&lt;br /&gt;Заранее спасибо.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:136267</id>
    <author>
      <name>Алексей Головко</name>
    </author>
    <lj:poster user="miserakl" userid="14154060"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/136267.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=136267"/>
    <title>Парсеры для Ur/Web.</title>
    <published>2012-02-13T11:57:40Z</published>
    <updated>2012-02-13T14:28:48Z</updated>
    <content type="html">А как на Ur строки парсить можно?&lt;br /&gt;&lt;br /&gt;(По идее, pure комбинаторы на Окамле могут скомпилироваться почти без изменений, но вроде всё виденное на Окамле использует ссылки и мутабельность.)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:135967</id>
    <author>
      <name>permea_kra</name>
    </author>
    <lj:poster user="permea_kra" userid="12792237"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/135967.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=135967"/>
    <title>Haskell+web</title>
    <published>2012-02-04T07:32:08Z</published>
    <updated>2012-02-04T07:32:08Z</updated>
    <content type="html">Товарищи писатели вебни на хаскеле! Здесь же есть такие?&lt;br /&gt;&lt;br /&gt;Мне нужно (для личных нужд) написать веб-приложение на хаскеле, работающее с базой. Будут храниться блобы&amp;nbsp; (0.2-5 Мб) с описанием в базе (да, именно в базе, а не в файловой системе) и раздаваться авторизованным пользователям. Плюс интерфейс загрузки - отдачи, плюс контроль прав.&lt;br /&gt;&lt;br /&gt;Существо я исключительно ленивое, поэтому чем проще в использовании будет решение, тем лучше. Какие решения вы посоветуете? А то пока я подумываю о написании CGI приложения в лоб, т.е. без сторонних библиотек, но это как-то не комильфо.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:135884</id>
    <author>
      <name>The Call of Cthulhu</name>
    </author>
    <lj:poster user="jdevelop" userid="970475"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/135884.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=135884"/>
    <title>quick check &amp; test data generator</title>
    <published>2012-01-27T00:50:41Z</published>
    <updated>2012-01-27T00:50:41Z</updated>
    <content type="html">привет, вопрос такого порядка - у меня есть несколько файлов, из которых построчно надо считать данные и сложить их в списки (скажем 5 списков)&lt;br /&gt;&lt;br /&gt;дальше по этим спискам надо нагенерить комбинаций по 5 - выбрать случайный элемент из каждого списка и получить кортеж&lt;br /&gt;&lt;br /&gt;курение документации и примеров по quickcheck не позволило ответить на вопрос - как передать в class Arbitrary Cortege списки, прочитанные из файла?&lt;br /&gt;&lt;br /&gt;пока варианты - записать списки в IORef, а внутри arbitrary через unsafeIO их читать, но это какой-то аццкий хак получается.&lt;br /&gt;&lt;br /&gt;как правильно?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:135476</id>
    <author>
      <name>Кирилл Кирсанов</name>
    </author>
    <lj:poster user="kkirsanov" userid="3249191"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/135476.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=135476"/>
    <title>case x of</title>
    <published>2012-01-22T21:46:31Z</published>
    <updated>2012-01-22T21:46:31Z</updated>
    <category term="Хаскель"/>
    <content type="html">В тренировочных целях пишу парсер простенького бинарного формата и столкнулся с не очевидным, для меня, поведением. &lt;br /&gt;Я побитово читаю данные и перевожу автомат между состояниями: parse :: Word8-&amp;gt;ParseState-&amp;gt;ParseState &lt;br /&gt;и получении некотрых конкретных значений - я меняю состояние.&lt;br /&gt;&lt;br /&gt;Сами эти значения я записал заранее:&lt;br /&gt;&lt;pre&gt;
data State = S1|S2|S3

b1 = 123
b2 = 213

parse b s = case (b, s) of
        (b1, S1) -&amp;gt; S2
        (_ , S1) -&amp;gt; S3
        (b2, S2) -&amp;gt; S1
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;При этом оказывается что &lt;pre&gt;(parse 2 S1) = S2&lt;/pre&gt;, хотя я хочу что бы сработало второе правило.&lt;br /&gt;причину такого поведения я кажется понял, теперь хотелось бы найти способ столь же красиво и лаконично это записать.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:135293</id>
    <author>
      <name>dimitrykakadu</name>
    </author>
    <lj:poster user="dimitrykakadu" userid="19315334"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/135293.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=135293"/>
    <title>[F#] Скрестить комбинаторы с FsYacc</title>
    <published>2012-01-18T14:38:52Z</published>
    <updated>2012-01-18T15:38:14Z</updated>
    <category term="f#"/>
    <category term="combinators"/>
    <category term="parser-combinators"/>
    <category term="fsyacc"/>
    <content type="html">Имеется парсер на комбинаторах. Предположим что восстановить грамматику из комбинаторов мы можем. Хочется (автоматически) заменить код на комбинаторах на вызов FsYacc.&lt;br /&gt;&lt;br /&gt;Проблема: Парсер комбинаторы парсят потоки Char а FsYacc хочет полноценный лексер (lexbuf и функцию из lexbuf в токены)&lt;br /&gt;Возможное решение: навелосипедить свою библитеку комбинаторов, где она будет принимать что-то лексероподобное, но посложнее чем просто поток символов.&lt;br /&gt;Ещё возможное решение: Оставить поток сиволов как есть, а некоторые парсер функции считать кусками лексера и превращать в регулярки, например. Т.е. из комбинаторов генерить свой лексер.&lt;br /&gt;&lt;br /&gt;Лично мне первое какжется по-проще.&lt;br /&gt;&lt;br /&gt;А вы бы как сделали?&lt;br /&gt;&lt;br /&gt;P.S. Чуть по-конкретнее, ибо меня уже завалили вопросами.&lt;br /&gt;На входе: дотнетовский класс, где методы --- это парсер-функции (т.е. имеют тип _ -&amp;gt; result)&lt;br /&gt;На выходе: дотнетовский класс, где вызовы некоторых методов подменены на вызовы fsyacc (Но типы те же и снаружи кажется, что ничего не поменялось)&lt;br /&gt;&lt;br /&gt;Здесь &amp;quot;некоторые методы&amp;quot; это методы, которые программист захотел сделать на fslex.&lt;br /&gt;Основные грабли: fsyacc ходит парой с fslex. А комбинаторы обычно парсят сразу поток сиволов (без токенизации, т.е. им лексер не нужен)&lt;br /&gt;Т.е. надо или как-то навелосипедить свои комбинаторы которые принимают не поток символов, а что-то лексеро-подобное. Либо из кода комбинаторов получать тем или иным образом информацию о лексере и генерить кроме кода на fsyacc код для fslex (что-то звучит страшновато)&lt;br /&gt;&lt;br /&gt;Надеюсь что-то прояснилось.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:135028</id>
    <author>
      <name>Кирилл Кирсанов</name>
    </author>
    <lj:poster user="kkirsanov" userid="3249191"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/135028.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=135028"/>
    <title>Вопросы новичка.</title>
    <published>2012-01-17T13:27:54Z</published>
    <updated>2012-01-17T13:28:23Z</updated>
    <content type="html">Продолжаю освоение хаскеля.&lt;br /&gt;&lt;br /&gt;Вот функция, покомпонентно преобразующая rgb цвет из Double в Word8&lt;br /&gt;&lt;pre&gt;
type ColorF = (Double, Double, Double)
type ColorB = (Word8, Word8, Word8)

f2b:: ColorF-&amp;gt;ColorB
f2b (r,g,b) = (p r, p g, p b)
               where p = round . (*255)
               where p x = round $ x*255

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;1) Какой из вариантов where предпочтительнее?&lt;br /&gt;2) Мне не нравится запись (p r, p g, p b), так и хочется сделать аналог map для коржей. Это правильное желание?&lt;br /&gt;3) Я правильно понимаю, что если хочу производительности на изображениях ([ColorB])то мне нужны ByteString и придется отказаться от удобных типов в угоду производительности?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:134841</id>
    <author>
      <name>Алексеев Александр</name>
    </author>
    <lj:poster user="afiskon" userid="17302724"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/134841.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=134841"/>
    <title>Haskell - State ( IO ) или IO ( State )?</title>
    <published>2012-01-16T15:02:19Z</published>
    <updated>2012-01-17T04:37:58Z</updated>
    <content type="html">&amp;nbsp;Разбираюсь тут в монаде State. Возник вопрос - а как бы ее поудобнее использовать вместе с монадой IO? Например, если я хочу не только состояние, но и использовать System.Random.&lt;br /&gt;&lt;br /&gt;Вот что мне удалось набросать самому:&lt;br /&gt;а) &lt;a href="https://github.com/afiskon/sandbox/blob/master/haskell/state-monad/example-random.hs" rel="nofollow"&gt;Используем только монаду State, при этом храним в состоянии генератор типа StdGen&lt;/a&gt;&lt;br /&gt;б) &lt;a href="https://github.com/afiskon/sandbox/blob/master/haskell/state-monad/io-state.hs" rel="nofollow"&gt;Монада IO, &amp;nbsp;вложенная в монаду State&lt;/a&gt;&lt;br /&gt;в) &lt;a href="https://github.com/afiskon/sandbox/blob/master/haskell/state-monad/state-io.hs" rel="nofollow"&gt;Монада State, вложенная в монаду IO&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В общем-то, все эти способы кажутся рабочими, но от них просто разит топорностью.&lt;br /&gt;&lt;br /&gt;Вопрос - как &amp;quot;правильно&amp;quot; такие вещи делаются в Haskell?&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;Ну и пользуясь случаем - может кто-нибудь показать пример работы с type IntState a = State Int a, то бишь без структур? Не могу понять, как в этом случае считать/записать состояние&lt;/strike&gt;. С этим я разобрался благодаря&amp;nbsp;&lt;span class='ljuser ljuser-name_aaknop' lj:user='aaknop' style='white-space:nowrap'&gt;&lt;a href='http://aaknop.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif?v=92.2' alt='[info]' width='16' height='16' style='vertical-align: bottom; border: 0; padding-right: 1px;'/&gt;&lt;/a&gt;&lt;a href='http://aaknop.livejournal.com/'&gt;&lt;b&gt;aaknop&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPD:&lt;/b&gt; Всем спасибо за помощь, вроде во всем разобрался.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:134590</id>
    <author>
      <name>limansky</name>
    </author>
    <lj:poster user="limansky" userid="7141746"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/134590.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=134590"/>
    <title>attoparsec и передача состояния.</title>
    <published>2011-12-29T12:25:21Z</published>
    <updated>2011-12-29T12:25:21Z</updated>
    <category term="haskell"/>
    <category term="attoparsec"/>
    <content type="html">Всем доброго дня.&lt;br /&gt;&lt;br /&gt;Возник вот такой (вероятнее всего тупой) вопрос. Собрался я написать парсер одного бинарного формата. Выбор либы пал на &lt;a href="http://hackage.haskell.org/packages/archive/attoparsec/0.10.1.0/doc/html/Data-Attoparsec-ByteString.html" rel="nofollow"&gt;attoparsec&lt;/a&gt;, который вроде бы для этого как раз и предназначен. Непонятно вот что. Как передать состояние внутрь парсера? Например в процессе парсинга находится какое-либо значение, которое потом нужно использовать чтобы разобрать следующий кусок данных (в другом парсере разумеется).</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:134363</id>
    <author>
      <name>Алексеев Александр</name>
    </author>
    <lj:poster user="afiskon" userid="17302724"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/134363.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=134363"/>
    <title>Перевод статьи "The equation of finding top-notch programmers to a bootstrapped start-up..."</title>
    <published>2011-12-27T06:41:43Z</published>
    <updated>2011-12-27T06:41:43Z</updated>
    <content type="html">"С точки зрения спроса я понял: никто не использует программистов Haskell. Таким образом, я пришел к выводу: здесь налицо избыточное предложение при нехватке спроса. Такая ситуация неминуемо должна привести к уменьшению цен, и, запуская новый проект, мы в самом деле сможем позволить себе нанять этих первоклассных программистов"&lt;br /&gt;&lt;br /&gt;Тут: &lt;a href='http://thesz.livejournal.com/1291235.html'&gt;http://thesz.livejournal.com/1291235.html&lt;/a&gt; эта статья немного обсуждалась. Возможно, вам будет интересно ознакомиться с ее переводом: &lt;a href='http://it-talk.org/topic2825.html' rel='nofollow'&gt;http://it-talk.org/topic2825.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:134006</id>
    <author>
      <name>dimitrykakadu</name>
    </author>
    <lj:poster user="dimitrykakadu" userid="19315334"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/134006.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=134006"/>
    <title>Генерация грамматик по парсер-комбинаторам</title>
    <published>2011-12-16T11:16:03Z</published>
    <updated>2011-12-16T11:16:03Z</updated>
    <category term="грамматики"/>
    <category term="комбинаторы"/>
    <content type="html">Мне тут поставили задачу: к весне сделать какую-то либу на F#, чтобы человек писал парсер-комбинаторные функции, а тула на основе этих функций бы генерировала парсер, который работает не комбинаторами a LALR, GLR, рекурсивный спуск и т.п. Разрешается туле не определять во что генерить каждый комбинатор, пускай человек подсказывает ей во что генерить. Код, который генерит парсер того или иного типа на основе определенной грамматике уже есть.&lt;br /&gt;&lt;br /&gt;Вопрос: на сколько я вляпался и не стоит ли мне слиться заранее? Честно, я примерно понимаю как комбинаторы работают, но пока я с ними на Вы. Люди говорят, что задача не особо интересная, так как генерить из комбинаторов грамматику обычно не нужно вообще.&lt;br /&gt;&lt;br /&gt;Спасибо, что мне подсказали про &lt;a href="http://thedeemon.livejournal.com/1155.html"&gt;ссылку &lt;/a&gt;&lt;span class='ljuser ljuser-name_thedeemon' lj:user='thedeemon' style='white-space:nowrap'&gt;&lt;a href='http://thedeemon.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif?v=92.2' alt='[info]' width='16' height='16' style='vertical-align: bottom; border: 0; padding-right: 1px;'/&gt;&lt;/a&gt;&lt;a href='http://thedeemon.livejournal.com/'&gt;&lt;b&gt;thedeemon&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&amp;#39;a? Теперь я примерно знаю как на камле генерить из комбинаторов конечные автоматы.&lt;br /&gt;&lt;br /&gt;Хочу вначале осмыслить концептуально как это должно выглядеть. Комментарии приветствуются.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:133698</id>
    <author>
      <email>thesz@mail.ru</email>
      <name>Serguey Zefirov</name>
    </author>
    <lj:poster user="thesz" userid="6959856"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/133698.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=133698"/>
    <title>Работа программистом-контрактором.</title>
    <published>2011-12-16T08:39:49Z</published>
    <updated>2011-12-16T08:39:49Z</updated>
    <category term="haskell"/>
    <category term="вакансии"/>
    <category term="работа"/>
    <content type="html">Стартап под названием &lt;a href="http://www.parsci.com/" rel="nofollow"&gt;Parallel Scientific&lt;/a&gt; ищет опытных программистов-контрактников для работы над высокопроизводительными вычислениями (high performance computing).&lt;br /&gt;&lt;br /&gt;Я узнал о них из Haskell-Cafe, где их &lt;a href="http://www.mail-archive.com/haskell-cafe@haskell.org/msg94878.html" rel="nofollow"&gt;рекомендовал сам SPJ&lt;/a&gt;. Кстати, руководители стартапа и Саймон довольно плотно общаются, насколько я понял.&lt;br /&gt;&lt;br /&gt;Хорошее знание Хаскеля обязательно. Основная задача - создание библиотек и &lt;a href="http://osdir.com/ml/cvs-ghc@haskell.org/2011-11/msg00173.html" rel="nofollow"&gt;оптимизаций компилятора&lt;/a&gt; (работа одного из первых участников компании) для ускорения работы научных и коммерческих вычислений на многопроцессорных машинах и кластерах.&lt;br /&gt;&lt;br /&gt;Я подчеркну, что Parallel Scientific уже имеет достаточный объём инвестиций (ранний этап, но уже инвестирован - early stages but funded). Это означает, что заработная плата будет весьма достойной - на уровне оплаты труда хороших программистов в США, но при возможности удалённой работы.&lt;br /&gt;&lt;br /&gt;Если всё это заинтересовало, то ваше резюме ждут на jobs@parsci.com.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:133563</id>
    <author>
      <email>squadette@gmail.com</email>
      <name>Alexey Mahotkin</name>
    </author>
    <lj:poster user="squadette" userid="270625"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/133563.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=133563"/>
    <title>ru_lambda @ 2011-12-12T17:35:00</title>
    <published>2011-12-12T16:35:41Z</published>
    <updated>2011-12-12T16:38:46Z</updated>
    <content type="html">коллеги,&lt;br /&gt;&lt;br /&gt;"Типы в языках программирования" в количестве 10 экземпляров поступили в магазин МЦНМО (адрес тут: &lt;a href='http://ru-lambda.livejournal.com/133077.html'&gt;http://ru-lambda.livejournal.com/133077.html&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Также по-прежнему действует предложение "Книга-почтой" из того же урла.&lt;br /&gt;&lt;br /&gt;Я очень ищу контакты распространителей в крупных городах - Санкт-Петербург, Новосибирск, Екатеринбург (или не столь крупных).  От магазинчика требуется находиться в более-менее удобном месте и быть готовым купить или взять на реализацию какое-то разумное количество порядка десятка и добирать по необходимости.  Пишите на squadette@gmail.com.&lt;br /&gt;&lt;br /&gt;P.S.: я надеюсь, что еще несколько постов на эту тему с интервалом в пару недель сообщество выдержит.  Если нет — извините, я перестану!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:133369</id>
    <author>
      <name>Кирилл Кирсанов</name>
    </author>
    <lj:poster user="kkirsanov" userid="3249191"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/133369.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=133369"/>
    <title>Code review</title>
    <published>2011-11-28T14:48:26Z</published>
    <updated>2011-11-28T14:48:26Z</updated>
    <category term="чайник"/>
    <content type="html">После длительных блужданий вокруг да около начал писать подсобные скрипты на хаскеле, а не на питоне.&lt;br /&gt;&lt;br /&gt;Вот первое детище: &lt;a href='https://gist.github.com/1400214' rel='nofollow'&gt;https://gist.github.com/1400214&lt;/a&gt; - работать то работает, но хотелось бы получить комментарии по стилю написания и потенциальным ошибкам.&lt;br /&gt;&lt;br /&gt;Делает следующее: читает список номеров из файла, делает по каждому номеру запрос, строит частотный словарь ответов.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:133077</id>
    <author>
      <email>squadette@gmail.com</email>
      <name>Alexey Mahotkin</name>
    </author>
    <lj:poster user="squadette" userid="270625"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/133077.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=133077"/>
    <title>"Типы в языках программирования", бумажная книга</title>
    <published>2011-11-27T20:23:16Z</published>
    <updated>2011-12-12T16:33:50Z</updated>
    <content type="html">коллеги,&lt;br /&gt;&lt;br /&gt;книгу "Типы в языках программирования" можно купить в Москве в:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0. В магазине МЦНМО (&lt;a href='http://www.mccme.ru/publications/shop.html'&gt;http://www.mccme.ru/publications/shop.html&lt;/a&gt;) за 1100 руб.&lt;br /&gt;1. Дом технической книги&lt;br /&gt;2. Московский дом книги (видимо Арбат)&lt;br /&gt;3. Библиоглобус&lt;br /&gt;4. Дом книги на Соколе&lt;br /&gt;5. Дом книги «Студент»&lt;br /&gt;6. Аргумент (лавки в МГУ)&lt;br /&gt;&lt;br /&gt;В Библиоглобусе она стоит примерно 1300 руб.&lt;br /&gt;&lt;br /&gt;Во все эти магазины имеет смысл звонить и уточнять наличие перед поездкой, потому что по непонятной мне причине туда уходит считанное количество экземпляров.&lt;br /&gt;&lt;br /&gt;До конца года обещают доставить в питерский Дом книги.&lt;br /&gt;&lt;br /&gt;По остальным городам пока непонятно, обновления в комментариях.&lt;br /&gt;&lt;br /&gt;В качестве публичного сервиса я могу отправлять книги (пока мне не надоест их заворачивать) по почте в другие города и страны (_не_ в Москву).  Это будет стоить 900 руб + стоимость доставки.  Чтобы договориться, присылайте письмо с подстрокой #tapl в сабджекте по адресу squadette@gmail.com, и укажите точный проверенный почтовый адрес с индексом.  Доставка Почтой России, наложенным платежом (или как-то еще).&lt;br /&gt;&lt;br /&gt;Вопросы, пожелания, предложения?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:132825</id>
    <author>
      <name>Некто под баобабом</name>
    </author>
    <lj:poster user="pod_baobabom" userid="9488651"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/132825.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=132825"/>
    <title>Применение комонад на практике</title>
    <published>2011-10-31T15:30:39Z</published>
    <updated>2011-10-31T15:52:35Z</updated>
    <content type="html">Всем привет.&lt;br /&gt;&lt;br /&gt;Возник, возможно, тривиальный вопрос. Как известно (в частности, из статьи Уодлера &amp;quot;The marriage of effects and monads&amp;quot;), любую разумную систему типов с эффектами (ну или *-passing style) можно транслировать в эквивалентную монадическую систему типов, которая тривиальным образом выражается в виде instance соответсвующей монады, скажем, в Haskell. Примером тому служит region calculus.&lt;br /&gt;&lt;br /&gt;При этом, в другой известной статье,&amp;nbsp;&amp;quot;Implicit Parameters: Dynamic Scoping with Static Types&amp;quot;, упоминается использование комонад как ограничений на environment, в котором производится вычисление. Другими словами, система типов с комонадами может, теоретически, накладывать ограничения на контекст, в котором типизируется тот или иной терм.&lt;br /&gt;&lt;br /&gt;Интересна практическая сторона вопроса. Были ли попытки описать что-нибудь типа co-unit и co-bind в общем случае? Сразу оговорюсь, что частных случаев полно - взять хотя бы популярные нынче системы типов для secure information flow.&lt;br /&gt;&lt;br /&gt;Заранее спасибо.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Upd: Кажется, нашёл то, что требовалось, с примерами:&amp;nbsp;&lt;i&gt;Codata and Comonads in Haskell&lt;/i&gt;. Richard B. Kieburtz.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:132534</id>
    <author>
      <name>deniok</name>
    </author>
    <lj:poster user="deni_ok" userid="12541508"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/132534.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=132534"/>
    <title>Какие библиотеки Haskell показывать студентам?</title>
    <published>2011-10-04T07:36:48Z</published>
    <updated>2011-10-04T07:36:48Z</updated>
    <content type="html">Уважаемые члены сообщества!&lt;br /&gt;&lt;br /&gt;Я в этом семестре читаю курс по функциональному программированию для магистров (Software Engineering), при этом основным языком является Haskell. Ребята достаточно сильные, курс достаточно длинный, поэтому в конце есть время рассказать подробно про какие-нибудь полезные библиотеки. &lt;br /&gt;&lt;br /&gt;Ясно, что джентльменский набор начинается с QuickCheck, про него рассказать необходимо. Номер два --- это Parsec, хотя тут я менее уверен; возможно лучше простую подобную библиотеку изготовить ручками, а на Parsec просто сослаться, что, мол, есть. &lt;br /&gt;&lt;br /&gt;Какие ещё библиотеки вы можете порекомендовать? Особенно жду ответа от тех, кто применяет Haskell в повседневной работе.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:132137</id>
    <author>
      <name>dmzlj</name>
    </author>
    <lj:poster user="dmzlj" userid="10761008"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/132137.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=132137"/>
    <title>Монадные трансформеры</title>
    <published>2011-09-26T05:30:39Z</published>
    <updated>2011-09-26T05:30:39Z</updated>
    <category term="haskell"/>
    <category term="hoopl"/>
    <content type="html">Допустим, у нас есть собственная монада, составленная как-то так:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
data CompileState = CompileState { cdict :: Dict, centry :: Maybe KId, ctmpid :: Int }
                    deriving (Show)

newtype CompileM a = CompileM {
    runT :: StateT CompileState (ErrorT CompileError IO) a
} deriving (Monad, MonadIO, MonadError CompileError, MonadState CompileState)


runCompile :: CompileState
              -&amp;gt; CompileM a
              -&amp;gt; IO (Either CompileError (a, CompileState))

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;и есть какой-то совершенно посторонний тип:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
type M = CheckingFuelMonad (SimpleUniqueMonad) 

runM :: M a -&amp;gt; a
runM m = runSimpleUniqueMonad $ runWithFuel 0 m
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;До некоторого момента, я запускал вычисления типа M  по отдельности:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;

runCompile $ do
   a &amp;lt;- runM $ ...
   b &amp;lt;- runM $ ...

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;и в общем, то, что M и CompileM никак не связаны особых неудобств не доставляло. К сожалению SimpleUniqueMonad отвечает за генерацию меток, и так получилось, что теперь нужно сделать сквозную генерацию этих меток, т.е. как-то вытащить SimpleUniqueMonad на внешний уровень:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;

runCompile $ do
   runM $ do
      a &amp;lt;- f1 :: CompileM ???
      b &amp;lt;- f2 :: CompileM ???
      c &amp;lt;- f3 a :: M x ???   

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Допустим, можно попытаться добавить M  в стек монад CompileM, но что для этого нужно сделать?&lt;br /&gt;Написать собственный трансформер для типа M?&lt;br /&gt;&lt;br /&gt;Можно ли это сделать, не вдаваясь в реализацию  CheckingFuelMonad / SimpleUniqueMonad ?&lt;br /&gt;Возможно ли добиться желаемого (запустить все вычисления в SimpleUniqueMonad ) как-то проще?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:131849</id>
    <author>
      <name>kouzdra</name>
    </author>
    <lj:poster user="kouzdra" userid="1935431"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/131849.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=131849"/>
    <title>Линейные типы:</title>
    <published>2011-09-25T07:08:40Z</published>
    <updated>2011-09-25T10:06:43Z</updated>
    <category term="clean"/>
    <category term="types"/>
    <content type="html">Один из сообщников у себя в блоге задает вопрос "уже кто-нибудь усвоил линейную логику в программировании?". Разумеется давно (лет 20 назад) освоили: позволю пару ссылок на Wiki - &lt;a href="http://en.wikipedia.org/wiki/Type_system#Linear_types" rel="nofollow"&gt;"Linear types"&lt;/a&gt; и &lt;a href=""&gt;"Clean"&lt;/a&gt; (Clean если кто не знает - язык очень близкий к Haskell и отличающийся от него пожалуй в основном как раз подходом к трактовке mutable states - именно для этого там и юзаются линейные типы) и на &lt;a href="http://wiki.clean.cs.ru.nl/ST_Publications" rel="nofollow"&gt;список публикаций&lt;/a&gt; Software Technology group of the MBSD section of the CS department of the University of Nijmegen (искать по ключевым словам "linear type" и "unique type").&lt;br /&gt;&lt;br /&gt;Идея проста и довольно продуктивна (хотя пока толком почему-то не востребована):&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Любой тип может иметь модификатор линейности (в clean она называется "уникальностью") - скажем Int и *Int. "Уникальность" означает, что на данное значение в данный момент времени существует единственная ссылка (а система типов это гарантирует) - если примитивно - то переменную уникального типа можно передать параметром только один раз функцию, а система типов этот контроль обеспечивает (в первом приближении - проверяя что все ее испльзования взаимоисключающие с точки зрения потока данных).&lt;br /&gt;&lt;br /&gt;Применений у них два: первое обслуживает ввод-вывод - в Clean не используются монадыю Вместо этого есть тип World(символизирующий окружающий мир), функция Start (аналог main) имеет тип&lt;br /&gt;&lt;pre&gt;Start:: *World -&amp;gt; *World,
&lt;/pre&gt;и есть функции, "отщепляющие" из мира разные другие сущности - файлы, "мир гуевых событий" etc. Выглядит это примерно так:&lt;br /&gt;&lt;pre&gt;module test
import StdEnv, StdFile

Start :: *World -&amp;gt; *World
Start world = 
  let (ok,file,world1) = fopen "test.file" FWriteText world in
  let file1 = Process file in
  let (ok,world2) = fclose file1 world1 in
  world2

Process :: *File -&amp;gt; *File
Process file = 
  let file1 = fwrites "Hello,\n" file  in
  let file2 = fwrites "World\n"  file1 in
  file2
&lt;/pre&gt;функция fopen "отщепляет"  *File от *World,возвращая статус, и "новый" *World, fwrites пишет в *File строчку, возвращая "новый" *File. Ну а fclose  "вливает" файл обратно "в большой мир"&lt;br /&gt;&lt;br /&gt;При попытке использовать "старый" file еще раз будет диагностика времени компиляции:&lt;br /&gt;&lt;pre&gt;Uniqueness error: "xxx" demanded attribute cannot be offered by shared object
&lt;/pre&gt;&lt;br /&gt;Обращу внимание на то, что  в операция fclose тут необходима вовсе не только в привычном нам смысле сброса буферов etc - если не влить *File обратно в *World - тот как и следует ожидать останется неизмененным - файл даже не создастся: если отвлечься от абстрактных причин - язык ленивый и если значение file1 не будет затребовано - никаких действий ведущих к его вычислению не будет и проделано.&lt;br /&gt;&lt;br /&gt;Разумеется такую  жуть пишут редко - имеется куча всякого синтаксисического сахара - например - операция &amp;lt;&amp;lt;&amp;lt;:&lt;br /&gt;&lt;pre&gt;class (&amp;lt;&amp;lt;&amp;lt;) infixl a :: !*File !a -&amp;gt; *File
instance &amp;lt;&amp;lt;&amp;lt; Char
instance &amp;lt;&amp;lt;&amp;lt; Int
...
&lt;/pre&gt;и вместо &lt;br /&gt;&lt;pre&gt;
let file1 = Process file in
let (ok,world2) = fclose file1 world1 in
&lt;/pre&gt;Можно просто написать &lt;br /&gt;&lt;pre&gt;  let (ok,world2) = fclose (file &amp;lt;&amp;lt;&amp;lt; "Hello," &amp;lt;&amp;lt;&amp;lt; "world\n") world1 in
&lt;/pre&gt;Ну и другие украшательства есть.&lt;br /&gt;&lt;br /&gt;Помимо "ввода-вывода" у линейных типов в Clean есть еще одно важное применение: эффективная работа с изменямыми агрегатными данными:&lt;br /&gt;&lt;pre&gt;module test2
import StdEnv, StdArray

Start :: *World -&amp;gt; {Int}
Start world =  update (createArray 10 1) 5 10 
&lt;/pre&gt;Напечатает &lt;br /&gt;&lt;pre&gt;{1,1,1,1,1,10,1,1,1,1}
&lt;/pre&gt;В отличие от Haskell операция update тут не вызовет копирования массива: &lt;br /&gt;&lt;pre&gt;class Array a e where
  update :: *(a e) Int e → *(a e)  
  createArray :: !Int e -&amp;gt; *(a e)
&lt;/pre&gt;Ну и последнее - полиморфизм по свойству линейности тип операции конкатенации списков выглядит так:&lt;br /&gt;&lt;pre&gt;(++) infixr 5 :: [u:a] w:[u:a] -&amp;gt; v:[u:a], [w&amp;lt;=v]
&lt;/pre&gt;Что означает, что ++ полиморфна по уникальности типа эемента списков (при этом этот атрибут должен быть одинаков у всех*). Запись же &lt;tt&gt;[w&amp;lt;=v]&lt;/tt&gt; означает, что если результат конкатенации должен быть уникален, то второй аргумент ++ также олжен быть уникальным списком.&lt;br /&gt;&lt;br /&gt;PS: Изложение, разумеется, упрощенное - за деталями - в статьи или в четвертую главу описания Clean.&lt;br /&gt;&lt;br /&gt;Upd: поскольку с ленивостью возникли непонятки, еще пример:&lt;br /&gt;&lt;pre&gt;Process :: Bool *File -&amp;gt; *File
Process b file = 
  let file1 = fwrites "Hello,\n" file  in
  let file2 = fwrites "World\n"  file1 in
  let file3 = fwrites "Galaxy\n" file1 in
  if b file2 file3
&lt;/pre&gt;В зависимости от первого аргумента в file будет записано либо "Hello, World" либо "Hello, Galaxy"&lt;br /&gt;&lt;hr&gt;&lt;small&gt;*) поскольку значение уникального типа может быть использовано как значение обычного типа - на практике это означает, что если хоть в одном из типов списков элемент не уникален - не уникальны они все&lt;/small&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:131717</id>
    <author>
      <name>dmzlj</name>
    </author>
    <lj:poster user="dmzlj" userid="10761008"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/131717.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=131717"/>
    <title>Control.Monad.Writer</title>
    <published>2011-09-22T05:01:13Z</published>
    <updated>2011-09-22T05:44:30Z</updated>
    <category term="haskell"/>
    <content type="html">Насколько хорошая идея использовать Control.Monad.Writer, если то, что я вывожу во Writer является,скажем так, существенной частью вычисления? например, распределение регистров протаскивается по вычислению явно из блока в блок, а сами инструкции байткода пишутся при помощи tell ? Или лучше такого не делать?&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;

...

    (r, code) &amp;lt;- runWriterT $ do flip runReaderT (trEnvInit dict live p) $ do
                                 mapM trBlock blocks

    trace ("\n\n\n" ++ (intercalate "\n" $ code) ++ "\n\n\n" ) $
      trace (intercalate "\n" $ concat r ) $ error "woops"


    where
      trEnvInit d l p = TREnv d l p

      trBlock b = foldBlockNodesF trNode b (return [])
      trNode :: forall e x . Insn e x -&amp;gt; TrM [String] -&amp;gt; TrM [String]
      trNode x r = tell [show x] &amp;gt;&amp;gt; liftM2 (++) r (return [show x])
...

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;печатает совсем не то, что ожидалось ( &lt;a href='https://gist.github.com/1c409fcaa99ab32a34e5' rel='nofollow'&gt;https://gist.github.com/1c409fcaa99ab32a34e5&lt;/a&gt; )   . Хотелось бы использовать именно Writer для упрощения кода, но, видимо, я что-то не понимаю.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ru_lambda:131542</id>
    <author>
      <name>Алексей Головко</name>
    </author>
    <lj:poster user="miserakl" userid="14154060"/>
    <link rel="alternate" type="text/html" href="http://ru-lambda.livejournal.com/131542.html"/>
    <link rel="self" type="text/xml" href="http://ru-lambda.livejournal.com/data/atom/?itemid=131542"/>
    <title>Haskell-in-the-web.</title>
    <published>2011-09-12T14:23:05Z</published>
    <updated>2011-09-12T15:03:02Z</updated>
    <content type="html">Кто-нибудь пробовал на практике писать веб-приложения (клиентскую часть) на хаскеле?&lt;br /&gt;Компиляторы из хаскела в джаваскрипт, yhc, uhc, ghcjs, все мёртвые и из коробки не собираются; поэтому я предполагаю или оставить идею и писать на джаваскрипте, или на хаскеле определить комбинаторы-макросы для js. Про второй вариант вопрос, как это лучше сделать? Хочется упростить работу с асинхронными запросами и уменьшить количество глупых ошибок вида "забыл отписаться от уведомлений при удалении виджета, память утекает" и "не всё обновил при получении новых данных". Также хочется простого способа описания виджетов (в идеале -- type-safe microtemplates с чётко обозначенными слотами для вставки поддеревьев виджетов, без необходимости разносить шаблон и код контроллера в разные файлы), и чтобы можно было делать составные виджеты.&lt;br /&gt;&lt;br /&gt;По идее, это всё не очень специфично для web -- во всех (низкоуровневых) gui-библиотеках приложение представляется деревом элементов, логика запрятана в обмене сообщениями-событиями (а сами хэндлеры довольно просты).&lt;br /&gt;Интересно было бы скомбинировать regions и что-то вроде session types, но неясно как и неочевидно, что это проще, чем вручную писать на джаваскрипте.</content>
  </entry>
</feed>

