<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>folone</title>
 
 <link href="http://www.folone.info/" />
 <updated>2012-05-16T00:30:26-07:00</updated>
 <id>http://www.folone.info.com/</id>
 <author>
   <name>folone</name>
   <email>folone@gmail.com.com</email>
 </author>

 
 
 
 
 
 
 
 
 
 
 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/folone/fp" /><feedburner:info uri="folone/fp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Scala User Group Ukraine</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/xjiqz0UiNc0/ScalaUA" />
   <updated>2012-03-30T00:00:00-07:00</updated>
   <id>http://www.folone.info/2012/03/30/ScalaUA</id>
   <content type="html">&lt;p&gt;На прошлых выходных прошла &lt;a href="http://dou.ua/calendar/1586/"&gt;третья встреча&lt;/a&gt; группы пользователей скалы в Украине. На ней я пытался рассказать о том, как мы используем у себя scalaz (&lt;a href="http://www.folone.info/docs/scalaz-presentation.html"&gt;ссылка на презентацию&lt;/a&gt;). Из сделанных выводов &amp;#8212; у меня немалые проблемы с докладами на публику: надо учиться внятно излагать.&lt;/p&gt;
&lt;p&gt;Пока не прошёл запал, запилил &lt;a href="http://scalaua.github.com/"&gt;сайт&lt;/a&gt; для юзергруппы, на &lt;a href="http://jaspervdj.be/hakyll/"&gt;hakyll&lt;/a&gt; &amp;#8217;е.&lt;br /&gt;
Так как &lt;a href="https://groups.google.com/forum/#!topic/scala-ua/ewDqZNVwd4k"&gt;гуглгруппу&lt;/a&gt; никто не читает, продублирую приглашение контрибьютить тут: очень яростно приглашаются люди, способные сверстать/задизайнить что-нибудь более симпатичное, чем я слизал &lt;a href="http://extralogical.net/"&gt;отсюда&lt;/a&gt;, нарисовать логотип, обвешать всякими твиттеро-фейсбуко-гугло виджетами, написать хороших статей, етс. О том, как запустить у себя сайт локально и контрибьютить, написано в &lt;a href="https://github.com/scalaua/scalaua.github.com/blob/master/README.md"&gt;readme&lt;/a&gt;. Со всеми вопросами, пожеланиями, идеями &amp;#8212; добро пожаловать ко мне в джаббер (folone@jabber.ru) или на почту (ссылка в футере).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/xjiqz0UiNc0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2012/03/30/ScalaUA</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Линкдамп №2</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/lg3bprgIxfo/Linkdump" />
   <updated>2012-03-02T00:00:00-08:00</updated>
   <id>http://www.folone.info/2012/03/02/Linkdump</id>
   <content type="html">&lt;p&gt;Ещё немного всячины из загашников (первая серия &lt;a href="/2012/01/12/Linkdump/"&gt;тут&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;Ниже следуют &lt;a href="http://stackoverflow.com/questions/6398996/good-haskell-source-to-read-and-learn-from/6399082#6399082"&gt;советы&lt;/a&gt; Дона Стюарта о том, какие сорцы стоит почитать на хаскелле, в ответ на один из вопросов на SO.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Код аспирантов, профессоров и постдоков из разных университетов:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/hinze-streams"&gt;Оксфордский&lt;/a&gt; стиль&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/monad-par"&gt;Стиль Гласгоу&lt;/a&gt; (или &lt;a href="http://hackage.haskell.org/package/hpc"&gt;тут&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/pretty-1.0.1.2"&gt;Chalmers-стайл&lt;/a&gt; (или &lt;a href="http://hackage.haskell.org/package/chalmers-lava2000"&gt;тут&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/smallcheck"&gt;Йорк-стайл&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/extcore-1.0.1"&gt;Портленд-стайл&lt;/a&gt; или &lt;a href="http://hackage.haskell.org/package/orc"&gt;&lt;span class="caps"&gt;OGI&lt;/span&gt;-стайл&lt;/a&gt; (или &lt;a href="http://hackage.haskell.org/package/mtl-1.0"&gt;тут&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/uu-parsinglib"&gt;Utrecht-стайл&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/haskore-vintage-0.1"&gt;Йельский стиль&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Особый случай: &lt;a href="http://hackage.haskell.org/package/unamb"&gt;&lt;span class="caps"&gt;CMU&lt;/span&gt;/Elliott&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Читать код &lt;del&gt;древних мастеров&lt;/del&gt; некоторых людей (список не полный):&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://research.microsoft.com/en-us/people/simonmar/"&gt;Саймон Марлоу&lt;/a&gt;, &lt;a href="http://www.soi.city.ac.uk/~ross/"&gt;Росс Пэтерсон&lt;/a&gt;, &lt;a href="http://research.microsoft.com/en-us/people/simonpj/"&gt;Саймон Пейтон Джонс&lt;/a&gt;, &lt;a href="http://www.ittc.ku.edu/csdl/fpg/Users/AndyGill"&gt;Энди Гилл&lt;/a&gt;, &lt;a href="http://corp.galois.com/john-launchbury/"&gt;Джон Лончбери&lt;/a&gt;, &lt;a href="http://www.chalmers.se/cse/EN/people/hughes-john"&gt;Джон Хьюз&lt;/a&gt;, &lt;a href="http://homepages.inf.ed.ac.uk/wadler/"&gt;Филипп Вадлер&lt;/a&gt;, &lt;a href="http://www.cs.ox.ac.uk/people/richard.bird/"&gt;Ричард Бёрд&lt;/a&gt;, &lt;a href="http://www.cse.chalmers.se/~koen/"&gt;Koen Claessen&lt;/a&gt;, &lt;a href="http://web.cecs.pdx.edu/~mpj/"&gt;Марк Джоунс&lt;/a&gt;, &lt;a href="http://web.cecs.pdx.edu/~apt/"&gt;Эндрю Толмак&lt;/a&gt;, &lt;a href="http://web.cecs.pdx.edu/~sheard/"&gt;Тим Шерд&lt;/a&gt;, &lt;a href="http://www.cs.uu.nl/staff/doaitse.html"&gt;S.D. Swierstra&lt;/a&gt;, &lt;a href="http://augustss.blogspot.com/"&gt;Augustsson&lt;/a&gt;, &lt;a href="http://www-users.cs.york.ac.uk/~colin/"&gt;Runciman&lt;/a&gt;, &lt;a href="http://www.haskellers.com/user/malcolm"&gt;Малкольм Воллес&lt;/a&gt;, &lt;a href="http://www.cs.kent.ac.uk/people/staff/sjt/"&gt;Саймон Томпсон&lt;/a&gt;, &lt;a href="http://www.cs.ox.ac.uk/ralf.hinze/"&gt;Ralf Hinze&lt;/a&gt;, &lt;a href="http://www.cs.ox.ac.uk/jeremy.gibbons/"&gt;Джереми Гиббонс&lt;/a&gt;, &lt;a href="http://research.microsoft.com/en-us/um/people/daan/"&gt;Daan Leijen&lt;/a&gt;, &lt;a href="http://www.cs.yale.edu/people/hudak.html"&gt;Пол Худак&lt;/a&gt;, &lt;a href="http://conal.net/"&gt;Конал Эллиотт&lt;/a&gt;, &lt;a href="http://haskell.forkio.com/"&gt;Finne&lt;/a&gt;, &lt;a href="http://www.cse.unsw.edu.au/~chak/"&gt;Manuel M T Chakravarty&lt;/a&gt; и&lt;/li&gt;
	&lt;li&gt;Любой, кто написал &lt;a href="http://www.haskell.org/haskellwiki/Research_papers/Functional_pearls"&gt;functional pearl&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Люди вроде меня (Дона Стюарта), Coutts, Mitchell, Брайана О&amp;#8217;Салливана, Lynagh, и прочих. учились хаскеллю у этих людей.&lt;/p&gt;
&lt;p&gt;Код некоторых приложений:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;код &lt;a href="http://hackage.haskell.org/package/base"&gt;базовой библиотеки &lt;span class="caps"&gt;GHC&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/xmonad"&gt;сорцы xmonad&amp;#8217;а&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Также, оказывается, вокруг стандартной библиотеки хаскелля &amp;#8212; множество наработок: альтернативные прелюдии и кастомные утилитарные библиотеки. Например:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/numeric-prelude"&gt;Numeric Prelude&lt;/a&gt; &amp;#8212; та самая прелюдия, в которой монады наследуются от функторов и добавлены прочие тайпклассы из теории категорий и абстрактной алгебры, также навешена их семантика.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.haskell.org/haskellwiki/The_Other_Prelude"&gt;The Other Prelude&lt;/a&gt; &amp;#8212; прелюдия со своими конвенциями и убеждениями, кардинально отличающимися от стандартной прелюдии, о которых можно почитать по &lt;a href="http://www.haskell.org/haskellwiki/Talk:The_Other_Prelude"&gt;ссылке&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/snoyberg/foundation"&gt;Foundation&lt;/a&gt; &amp;#8212; альтернативная прелюдия от небезызвестного Миши Сноймана, автора веб-фреймворка &lt;a href="http://www.yesodweb.com/"&gt;yesod&lt;/a&gt; (с иврита переводится как &amp;#8220;основа&amp;#8221;) и абстракции &lt;a href="http://www.yesodweb.com/blog/2011/12/conduits"&gt;conduit&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/category-extras"&gt;Category Extras&lt;/a&gt; &amp;#8212; упоминал в прошлом посте, и в этом упомяну. Ох, чего там только нету. И осиливать это &amp;#8212; не переосиливать.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/MissingH"&gt;MissingH&lt;/a&gt; &amp;#8212; библиотека с утилитами от небезызвестного &lt;a href="http://www.complete.org/JohnGoerzen"&gt;John Goerzen&lt;/a&gt;. Заявляется, что библиотека для тех, кто хочет делать практические штуки быстро (в отличие от предыдущей библиотеки, где упор сделан на теорию). Проект на &lt;a href="https://github.com/jgoerzen/missingh/wiki"&gt;гитхабе&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/isomorphism/Overture"&gt;Overture&lt;/a&gt; и &lt;a href="https://github.com/nfjinjing/air"&gt;Air&lt;/a&gt; &amp;#8212; ещё две библиотеки. Ссылки нашёл на &lt;a href="http://www.reddit.com/r/haskell/comments/ppwst/the_other_prelude_any_activity_here_it_seems_like/c3rapog"&gt;реддите&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Из обсуждаемого в последнее время &amp;#8212; &lt;a href="http://brianmckenna.org/blog/type_errors_as_warnings"&gt;вывод ошибок системы типов в виде ворнингов&lt;/a&gt; с поммощью некоей опции компилятора. В этом контексте так же интересен ввод некоего &amp;#8220;магического&amp;#8221; значения, которое всегда не тайпчекается, вместо &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Интересная штука, о которой мне рассказал сотрудник &amp;#8212; &lt;a href="http://www.mail-archive.com/glasgow-haskell-users@haskell.org/msg21143.html"&gt;обсуждение&lt;/a&gt; возможности добавления &amp;#8220;holes&amp;#8221; из Агды в хаскелль. Вкратце, когда среда редактирования (ghci, или емакс мод) встречает такие вот &amp;#8220;дырки&amp;#8221; (обозначенные, например, так: &lt;code&gt;__&lt;/code&gt;), она подсказывает тип того, что там должно быть, а также показывает список того, что есть в скоупе такого, что подошло бы вместо &amp;#8220;дырки&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.lambdacat.org/escape.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/lg3bprgIxfo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2012/03/02/Linkdump</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Recursion Schemes, a Field Guide to Recursion Schemes, a Field Guide to ...</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/D-AxxLLf3Ts/RecursionSchemes" />
   <updated>2012-02-29T00:00:00-08:00</updated>
   <id>http://www.folone.info/2012/02/29/RecursionSchemes</id>
   <content type="html">&lt;p align="right"&gt;Морфизм (стрелка) — в общем смысле преобразование любого рода из одного объекта категории в другой.&lt;/p&gt;
&lt;p&gt;Пытаюсь осилить &lt;a href="http://research.microsoft.com/~emeijer/Papers/fpca91.pdf"&gt;Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire&lt;/a&gt;. В процессе составил такую вот табличку. Референсом служила &lt;a href="http://comonad.com/reader/2009/recursion-schemes/"&gt;вот эта таблица&lt;/a&gt; и вот &lt;a href="http://hackage.haskell.org/package/recursion-schemes"&gt;этот проект&lt;/a&gt;. Ну и вообще &lt;a href="http://comonad.com/reader/"&gt;бложек&lt;/a&gt; Эдварда Кметта, человека и парахода.&lt;br /&gt;
Зна́ком вопроса помечены определения, в которых я ну совсем не уверен и не осилил. По мере прочтения и понимания, таблица будет апдейтиться. Буду весьма благодарен дополнениям, поправкам, другим примерам и рекомендациям, чего бы почитать по теме.&lt;/p&gt;
&lt;table style="border:1px solid black;"&gt;
	&lt;tr style="background:#ddd;"&gt;
		&lt;td style="text-align:center;" colspan="4"&gt;Folds&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Схема&lt;/th&gt;
		&lt;th&gt;Код&lt;/th&gt;
		&lt;td style="width:50%;"&gt;&lt;strong&gt;Описание&lt;/strong&gt;&lt;/td&gt;
		&lt;th&gt;Краткий пример&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Catamorphism"&gt;катаморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L94"&gt;Cata&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;обобщение свёртки структур на произвольные алгебраические типы данных, от греч. κατά = вниз, проверочное слово &amp;#8212; катастрофа&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;foldr&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Paramorphism"&gt;параморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L99"&gt;Para&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;свёртка структуры при помощи примитивной рекурсии, от греч. παρά = вместе, “eats its argument and keeps it too”&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;dropWhile&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://www.iis.sinica.edu.tw/~scm/2010/functional-pearl-maximally-dense-segments/"&gt;зигоморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L363"&gt;Zygo&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;свёртка структуры при помощи вспомогательной функции, являющейся катаморфизмом, взаимная рекурсия&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://cs.ioc.ee/~tarmo/papers/inf.ps.gz"&gt;хистоморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L399"&gt;Histo&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;свёртка структуры на основе предыдущих вызовов (на каждом шаге доступ к результатам, полученным на предыдущих шагах), &amp;#8220;аннотирует&amp;#8221; каждый следующий элемент структуры результатом, полученным из предыдущих элементов&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://wwwhome.cs.utwente.nl/~fokkinga/#detail_0000003532"&gt;препроморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L106"&gt;Prepro&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt; свёртка структуры после последовательного применения натурального преобразования&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="background:#ddd;"&gt;
		&lt;td style="text-align:center;" colspan="4"&gt;Unfolds&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Схема&lt;/th&gt;
		&lt;th&gt;Код&lt;/th&gt;
		&lt;th&gt;Описание&lt;/th&gt;
		&lt;th&gt;Краткий пример&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Anamorphism"&gt;анаморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L132"&gt;Ana&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;обобщение разворачивания структур на произвольные алгебраические типы данных, от греч. ἀνά = вверх, проверочное слово &amp;#8212; анаболизм&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;unfold&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Apomorphism"&gt;апоморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L138"&gt;Apo&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;примитивная &lt;a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F"&gt;корекурсия&lt;/a&gt;. собирается&lt;br /&gt;
структура по одному уровню за итерацию, от греч. ἀπό = отдельно&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;zip, iterate&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://www.mii.lt/informatica/pdf/INFO141.pdf"&gt;футуморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L245"&gt;Futu&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;собирается несколько уровней за одну итерацию &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;постпроморфизм&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L142"&gt;Postpro&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;разворачивается структура и последовательно применяется натуральное преобразование &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="background:#ddd;"&gt;
		&lt;td style="text-align:center;" colspan="4"&gt;Refolds&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Схема&lt;/th&gt;
		&lt;th&gt;Код&lt;/th&gt;
		&lt;th&gt;Описание&lt;/th&gt;
		&lt;th&gt;Краткий пример&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Hylomorphism_(computer_science)"&gt;хиломорфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L160"&gt;Hylo&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;анаморфизм + катаморфизм, от греч. ὑλο = материя&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;fact n = product [1..n]&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/reader/2008/time-for-chronomorphisms/"&gt;хрономорфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Chrono.hs"&gt;Chrono&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;футуморфизм + хистоморфизм &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;синхрономорфизм&lt;/td&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Synchro.hs"&gt;Synchro&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;высокоуровневое преобразование между двумя структурами, которое использует третью структуру для получения промежуточных данных &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;экзоморфизм&lt;/td&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Exo.hs"&gt;Exo&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;высокоуровневое преобразование между структурами из триалгебры в биалгебру &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;метаморфизм&lt;/td&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Meta/Erwig.hs"&gt;Erwig&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;хиломорфизм, выраженный в терминах биалгебры &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Metamorphism_(computer_science)"&gt;метаморфизм&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Meta/Gibbons.hs"&gt;Gibbons&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;обратный хиломорфизм: катаморфизм + анаморфизм; изменение репрезентации&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;динаморфизм&lt;/td&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Dyna.hs"&gt;Dyna&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;анаморфизм + хистоморфизм &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://arxiv.org/abs/cs/0609040"&gt;Elgot алгебра&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L423"&gt;Elgot&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;во время fold&amp;#8217;а может остановиться &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="http://comonad.com/reader/2008/elgot-coalgebras/"&gt;Elgot коалгебра&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="hhttps://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L427"&gt;CoElgot&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;во время unfold&amp;#8217;а может остановиться &lt;span style="color:red;"&gt;(?)&lt;/span&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Ну и легендарный &lt;a href="http://www.haskell.org/haskellwiki/Zygohistomorphic_prepromorphisms"&gt;зигохистоморфный препроморфизм&lt;/a&gt; (&lt;a href="https://github.com/ekmett/recursion-schemes/blob/master/Data/Functor/Foldable.hs#L433"&gt;код&lt;/a&gt;). Сам Кметт даёт некоторые объяснения в &lt;a href="http://haskell.1045720.n5.nabble.com/Master-s-thesis-topic-sought-td3142012.html#a3142015"&gt;этом сообщении&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Бонусом &amp;#8212; вот такая вот &lt;a href="http://cale.yi.org/share/Folds.svg"&gt;диаграмма свёрток&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; В процессе написания этого поста обнаружилась вот такая вот работа: &lt;a href="http://dl.dropbox.com/u/4274210/Books/General%20FP/CWIReport.pdf"&gt;Program Calculation Properties of Continuous Algebras&lt;/a&gt;. Работа весьма хардкорная. Сам &amp;#8220;Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire&amp;#8221; для меня очень хардкорен. Так вот, эта, судя по беглому пролистыванию, ещё более хардкорная. Будем осиливать понемногу, что делать.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.P.S.&lt;/strong&gt; Ну и вот &lt;a href="http://hackage.haskell.org/package/category-extras"&gt;этот пакет&lt;/a&gt; просто поражает воображение.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/D-AxxLLf3Ts" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2012/02/29/RecursionSchemes</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Scalaz Unicode</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/n1lLKYGwR7w/Scalaz-Unicode" />
   <updated>2012-02-28T00:00:00-08:00</updated>
   <id>http://www.folone.info/2012/02/28/Scalaz-Unicode</id>
   <content type="html">&lt;p&gt;Собрал небольшую табличку юникод-алиасов из scalaz. В нижней части &amp;#8212; алиасы из самой скалы:&lt;/p&gt;
&lt;table style="border:1px solid black;"&gt;
	&lt;tr style="background:#ddd;"&gt;
		&lt;td style="text-align:center;" colspan="4"&gt;Scalaz&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Символ&lt;/th&gt;
		&lt;th&gt;Код&lt;/th&gt;
		&lt;th&gt;Ascii эквивалент&lt;/th&gt;
		&lt;th&gt;Пример&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;η&lt;/td&gt;
		&lt;td&gt;951&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Identity.scala#L186"&gt;pure&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;1.η[List]&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;μ&lt;/td&gt;
		&lt;td&gt;03BC&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L341"&gt;join&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;List(List(1,2,3), nil, List(5,6,7)) μ&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∅&lt;/td&gt;
		&lt;td rowspan="2"&gt;2205&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Zero.scala#L29"&gt;zero&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;∅[Int]&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&amp;lt;∅&amp;gt;&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Empty.scala#L10"&gt;empty&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;&amp;lt;∅&amp;gt;[Option, Int]&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∙&lt;/td&gt;
		&lt;td&gt;2219&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L360"&gt;contramap&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;((_:String).length ∙ (_:Int).toString ∙ ((_:Int) + 6))(5)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∘&lt;/td&gt;
		&lt;td rowspan="2"&gt;2218&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L323"&gt;map&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;(((_:Int) + 6) ∘ (_:Int).toString ∘ (_:String).length)(5)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∘∘&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L326"&gt;map2&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;(List(Some(7), None, Some(8)) ∘∘ (1 + (_: Int)))&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;☆&lt;/td&gt;
		&lt;td&gt;2606&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Kleisli.scala#L38"&gt;kleisli&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;val k = ☆((n: List[Int]) =&amp;gt; if(n.isEmpty) None else Some(n ∘ (_.shows.reverse)))&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;★&lt;/td&gt;
		&lt;td&gt;2605&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Cokleisli.scala#L20"&gt;cokleisli&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;val sum = ★((m: NonEmptyList[Int]) =&amp;gt; m.sum)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;σ&lt;/td&gt;
		&lt;td&gt;963&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Identity.scala#L189"&gt;dual&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;"1".σ ⊹ "2".σ&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⊛&lt;/td&gt;
		&lt;td&gt;229B&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L335"&gt;&amp;#124;@&amp;#124;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;(List(1,2) ⊛ List(3,4)){_ + _}&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∃&lt;/td&gt;
		&lt;td&gt;2203&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L344"&gt;any&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;List(1,2,3) ∃ (_ &amp;lt; 2)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∀&lt;/td&gt;
		&lt;td&gt;2200&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L347"&gt;all&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;List(1,2,3) ∀ (_ &amp;gt; 0)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;↦&lt;/td&gt;
		&lt;td&gt;21A6&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L338"&gt;traverse&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;List(1,2,3) ↦ (_.some)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;ʐ&lt;/td&gt;
		&lt;td&gt;0290&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/StreamW.scala#L6"&gt;zip&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;Stream(1,2,3).ʐ&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⋙&lt;/td&gt;
		&lt;td&gt;22D9&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MAB.scala#L15"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;(((_:Int) + 5) &amp;amp;&amp;amp;&amp;amp; ((_:Int) * 2)) ⋙ { case(x,y) =&amp;gt; x + y }&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⋘&lt;/td&gt;
		&lt;td&gt;22D8&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MAB.scala#L19"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;((_:String).toInt) ⋘ ((_:Int).toString)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⊥&lt;/td&gt;
		&lt;td&gt;22A5&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Scalaz.scala#L70"&gt;undefined&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;lazy val error = ⊥&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∗&lt;/td&gt;
		&lt;td&gt;2217&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L329"&gt;flatMap&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;some(6) ∗ {case x =&amp;gt; some(x+1)}&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Scalaz.scala#L80"&gt;π&lt;/a&gt;&lt;/td&gt;
		&lt;td rowspan="2"&gt;03C0&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
		&lt;td rowspan="2"&gt;&lt;code&gt;val radians = ((_:Int) * π / 180, (_:Int) * 360 / π2)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Scalaz.scala#L82"&gt;π2&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Scalaz.scala#L88"&gt;×&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;00D7&lt;/td&gt;
		&lt;td&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;×[Int,Int](5)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⊹&lt;/td&gt;
		&lt;td&gt;8889&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Identity.scala#L192"&gt;‌&amp;#124;+‌&amp;#124;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;some(1) ⊹ none&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∏&lt;/td&gt;
		&lt;td&gt;220f&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/IntW.scala#L6"&gt;multiplication&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;(7 ∏) ⊹ (8 ∏)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;≟&lt;/td&gt;
		&lt;td&gt;8799&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Identity.scala#L195"&gt;===&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;"" ≟ 5&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;≠&lt;/td&gt;
		&lt;td&gt;8800&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Identity.scala#L198"&gt;/==&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;"" ≠ 5&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∋&lt;/td&gt;
		&lt;td&gt;220B&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L353"&gt;contains&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;List(1,2,3) ∋ 3&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∈&lt;/td&gt;
		&lt;td&gt;2208&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/MA.scala#L350"&gt;contains&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;50 ∈: Stream.range(0, 100)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∧&lt;/td&gt;
		&lt;td&gt;2227&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L21"&gt;&lt;span class="caps"&gt;AND&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;true ∧ false&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;∨&lt;/td&gt;
		&lt;td&gt;2228&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L34"&gt;OR&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;true ∨ true&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⊽&lt;/td&gt;
		&lt;td&gt;22BD&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L47"&gt;&lt;span class="caps"&gt;NOR&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;false ⊽ true&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⊼&lt;/td&gt;
		&lt;td&gt;22BC&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L60"&gt;&lt;span class="caps"&gt;NAND&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;false ⊼ false&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;→&lt;/td&gt;
		&lt;td&gt;2192&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L73"&gt;Conditional&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;true → true&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⇐&lt;/td&gt;
		&lt;td&gt;21D0&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L86"&gt;Inverse Conditional&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;false ⇐ true&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⇏&lt;/td&gt;
		&lt;td&gt;21CF&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L99"&gt;Negational of Conditional&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;false ⇏ true&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⇍&lt;/td&gt;
		&lt;td&gt;21CD&lt;/td&gt;
		&lt;td&gt;&lt;a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/BooleanW.scala#L112"&gt;Negation of Inverse Conditional&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;false ⇍ true&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="background:#ddd;"&gt;
		&lt;td style="text-align:center;" colspan="4"&gt;Scala&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;⇒&lt;/td&gt;
		&lt;td&gt;21D2&lt;/td&gt;
		&lt;td&gt;=&amp;gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;.map { case(x,y) ⇒ x * y }&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;←&lt;/td&gt;
		&lt;td&gt;2190&lt;/td&gt;
		&lt;td&gt;&amp;lt;-&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;for { x ← res2 } yield (x*x)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;→&lt;/td&gt;
		&lt;td&gt;2192&lt;/td&gt;
		&lt;td&gt;-&amp;gt;&lt;/td&gt;
		&lt;td&gt;&lt;code&gt;List(1 → 2, 2 → 3, 3 → 4)&lt;/code&gt;&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Полезный пример от самих авторов &amp;#8212; &lt;a href="https://github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/example/ExampleAscii.scala"&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; В конфиг емакса &lt;a href="https://github.com/folone/.emacs/blob/master/overconfig.el#L266"&gt;добавил&lt;/a&gt; следующую утилитарную функцию:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scheme"&gt;&lt;span class="c1"&gt;;; This function does some scala code prettifying.&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;prettify-scala-code&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;Replace ascii with it&amp;#39;s unicode counterparts.&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;save-excursion&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;beginning-of-buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;replace-table&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-hash-table&lt;/span&gt; &lt;span class="nv"&gt;:test&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;equal&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
          &lt;span class="nv"&gt;replaces&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;puthash&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;=&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;⇒&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;replace-table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;puthash&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;-&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;←&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;replace-table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;puthash&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;-&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;→&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;replace-table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;maphash&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toreplace&lt;/span&gt; &lt;span class="nv"&gt;withreplace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;replace-string&lt;/span&gt; &lt;span class="nv"&gt;toreplace&lt;/span&gt; &lt;span class="nv"&gt;withreplace&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
               &lt;span class="nv"&gt;replace-table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;replaces&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;global-set-key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C-c p&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;prettify-scala-code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/n1lLKYGwR7w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2012/02/28/Scalaz-Unicode</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Линкдамп</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/Ar_0NqOmC_w/Linkdump" />
   <updated>2012-01-12T00:00:00-08:00</updated>
   <id>http://www.folone.info/2012/01/12/Linkdump</id>
   <content type="html">&lt;p&gt;Скопилось немного всякой всячины, которую никак не получается категоризовать во что-нибудь осмысленное. Потому ссылочки и небольшие комментарии:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;В авторитетном источнике найдено доказательство того, что хаскелль &amp;#8212; это лисп (&lt;a href="http://juick.com/folone/1710288"&gt;обсуждение&lt;/a&gt;):&lt;br /&gt;
  &lt;img src="http://books.google.com.ua/books?id=5Xk-AQAAIAAJ&amp;amp;pg=PA1&amp;amp;img=1&amp;amp;pgis=1&amp;amp;dq=%22As+a+functional+programming+language,+Haskell+is+a+member+of+the+Lisp+family.+Others+family+members+are+Scheme,+ML,+Occam,+Clean.%22&amp;amp;sig=ACfU3U35SuHRWF5KskRtjgUl6OBORZhQKA&amp;amp;edge=0" alt="" /&gt;&lt;/li&gt;
	&lt;li&gt;Заполучил &lt;a href="http://newstar.rinet.ru/~goga/tapl/"&gt;&lt;span class="caps"&gt;TAPL&lt;/span&gt; на русском&lt;/a&gt;, по пути узнал, что есть &lt;a href="http://www.amazon.com/Advanced-Topics-Types-Programming-Languages/dp/0262162288/"&gt;продолжение&lt;/a&gt;. Немного непонятно, почему &amp;#8220;Reading level: Ages 18 and up&amp;#8221;. Сцены насилия над мозговой тканью во все поля, да.&lt;/li&gt;
	&lt;li&gt;Чуть более серьёзный набор ссылок: оказывается, исторические проблемы в тайпклассах хаскелля (монада &amp;#8212; не функтор и иже с ними) не дают покоя многим. Потому есть &lt;a href="http://www.haskell.org/haskellwiki/Numeric_Prelude"&gt;Numeric Prelude&lt;/a&gt;, где эта проблема успешно решена. Также добавлены новые тайпклассы, описывающие алгебраические структуры: группа, кольцо, поле, т.д. В общем, обмазываться-непереобмазаться.&lt;/li&gt;
	&lt;li&gt;Также узнал о &lt;a href="http://hackage.haskell.org/trac/haskell-prime/"&gt;Haskell&amp;#8217;&lt;/a&gt;. Узнал благодаря тому, что увидел незнакомый &lt;code&gt;(.:)&lt;/code&gt; в &lt;code&gt;#haskell&lt;/code&gt;, который lambdabot, тем не менее, вполне проглотил и не подавился. Более того, сказал, что по типу оно эквивалентно сиськам: &lt;code&gt;(.).(.)&lt;/code&gt;. &lt;a href="http://www.reddit.com/r/haskell/comments/nxu8d/f_g_x_y_f_g_x_y_in_haskell_prime_prelude/"&gt;Обсуждение&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;Огромнейшим откровением для меня стал тот факт, что для функции &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/src/Control-Monad-Instances.html"&gt;определён&lt;/a&gt; инстанс монады. Благодаря этому возможны штуки вроде &lt;code&gt;(*) =&amp;lt;&amp;lt; (-) =&amp;lt;&amp;lt; (+4) $ 5&lt;/code&gt;. Я хороший промежуток времени потратил, чтобы это осилить. Кажется, пора перечитать &lt;a href="http://www.haskell.org/haskellwiki/Typeclassopedia"&gt;типоклассопедию&lt;/a&gt;: в первое прочтение 80% информации оказалась непо́нятой.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://spl.smugmug.com/Humor/Lambdacats/cats-map-lol-cats/960526179_oaZFS-O-1.jpg" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/Ar_0NqOmC_w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2012/01/12/Linkdump</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Roy, статически типизированный джаваскрипт.</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/pLPJ4O5RxR0/RoyJS" />
   <updated>2011-12-09T00:00:00-08:00</updated>
   <id>http://www.folone.info/2011/12/09/RoyJS</id>
   <content type="html">&lt;p&gt;Каждый раз начиная новый проект под веб, стоит проблема выбора стека технологий. Для меня сервер-сайд технологии более-менее определены (планирую поменять &lt;a href="http://liftweb.net/"&gt;lift&lt;/a&gt; на &lt;a href="http://scala.playframework.org/"&gt;play&lt;/a&gt;, но это мелочи). Тем не менее, UI &amp;#8212; это каждый раз компромисс. Так хочется статически-типизированный язык. Тем не менее, по отзывам, с вариантами вроде &lt;span class="caps"&gt;GWT&lt;/span&gt; &lt;a href="https://vaadin.com/home"&gt;и иже с ним&lt;/a&gt; проблем во время дебага не оберёшься.&lt;/p&gt;
&lt;p&gt;На новом проекте я наконец решил заюзать что-нибудь эдакое. После некоторого &lt;a href="http://altjs.org/"&gt;ресёрча&lt;/a&gt; выбрал &lt;a href="http://roy.brianmckenna.org/"&gt;Roy&lt;/a&gt;. Уверен, с этим выбором будет связано множество недовольств в команде: язык очень молодой, поддерживается парой энтузиастов и вообще выглядит непривычно для среднестатистического веб-девелопера. Тем не менее, статическая типизация, синтаксис, похожий на хаскелль, паттерн матчинг, do-нотация, вызовы к сторонним библиотекам (правда, пока такие вызовы не типизированы) и вывод типов с помощью алгоритма &lt;a href="http://en.wikipedia.org/wiki/Hindley%E2%80%93Milner"&gt;Хиндли-Милнера&lt;/a&gt; взяли своё. К тому же, на выходе получается вполне вменяемый и читаемый (!) джаваскрипт. Что значит, что если вдруг не приживётся, выкинуть будет очень просто.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://spl.smugmug.com/Humor/Lambdacats/13227630_j2MHcg#960526434_XbHXq"&gt;&lt;img src="http://spl.smugmug.com/Humor/Lambdacats/unsafe/960526434_XbHXq-M-1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Так как язык очень молодой, пришлось делать периферийную работу:&lt;br /&gt;
Первым, что я сделал &amp;#8212; на скорую руку склепал &lt;a href="https://github.com/folone/roy-mode"&gt;roy-mode&lt;/a&gt;. Делал на основе &lt;a href="http://www.emacswiki.org/emacs/GenericMode"&gt;generic-mode&lt;/a&gt;, что оказалось весьма простым занятием:&lt;/p&gt;
&lt;script src="https://gist.github.com/1447544.js?file=gistfile1.el"&gt;&lt;/script&gt;&lt;p&gt;Строки вида &lt;code&gt;"\\&amp;lt;\\(e\\(?:mpty\\|ven\\)\\|f\\(?:ilter\\|lip\\|oldl\\)\\|head\\|id\\|l..."&lt;/code&gt; &amp;#8212; регулярные выражения. Получить их можно с помощью функции &lt;a href="http://www.emacswiki.org/emacs/RegexpOpt"&gt;regexp-opt&lt;/a&gt; (тут они просто вставлены в код по причине того, что в туториалах пишут, что так должно работать быстрей).&lt;/p&gt;
&lt;p&gt;Получилось что-то такое:&lt;br /&gt;
&lt;img src="http://i.imgur.com/hf3aJ.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Над модом ещё работать и работать: нету поддержки компилятора, автоотступов, етс (читай: &amp;#8220;pull requests are very welcome&amp;#8221;). Тем не менее, после того как я обзавёлся каким-никаким методом ввода кода, пришло время автоматизировать компиляцию этого самого кода. Так как сборка на наших проектах производится мейвеном, был быстренько написан &lt;a href="https://github.com/folone/roy-maven-plugin"&gt;плагин&lt;/a&gt;. Благодаря пакету &lt;a href="http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/sys/process/ProcessBuilder.html"&gt;&lt;code&gt;scala.sys.process&lt;/code&gt;&lt;/a&gt;, включающему в себя удобный &lt;span class="caps"&gt;DSL&lt;/span&gt; для описания shell-команд, код получился весьма небольшим и довольно читабельным.&lt;br /&gt;
Получаем все roy-файлы в директории:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;recursiveListFiles&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;File&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Regex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listFiles&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;good&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findFirstIn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="n"&gt;isDefined&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;good&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isDirectory&lt;/span&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="n"&gt;flatMap&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;recursiveListFiles&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;)}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;filesToCompile&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recursiveListFiles&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;.*\.roy$&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Компилим каждый и перекидываем результат в директорию с джаваскриптом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;compileFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;File&lt;/span&gt;&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;File&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;roy &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getPath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;jsFile&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileExtToJs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getPath&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;jsFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renameTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;fileExtToJs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;roy&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;roy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="o"&gt;:+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;js&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;mkString&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;filesToCompile&lt;/span&gt; &lt;span class="n"&gt;foreach&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;compileFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Оператор &lt;code&gt;!&lt;/code&gt; выполняет последовательность shell-команд и возвращает код выхода. Если же нужен текстовый вывод последовательности, можно использовать оператор &lt;code&gt;!!&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Понятное дело, и roy-mode&amp;#8217;у и мейвен-плагину для корректной работы нужен установленный roy: &lt;code&gt;npm install roy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Итого, инфраструктура в зачаточном состоянии есть. Надеюсь, roy сможет решить главную возложенную на него задачу: помочь получать наконец удовольствие от UI-разработки под веб.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/pLPJ4O5RxR0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/12/09/RoyJS</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Частичный апдейт немутабельных данных</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/T4Re4cuFtfA/PartialUpdate" />
   <updated>2011-11-29T00:00:00-08:00</updated>
   <id>http://www.folone.info/2011/11/29/PartialUpdate</id>
   <content type="html">&lt;p align="right"&gt;&amp;#8220;Lenses are the coalgebras for the costate comonad&amp;#8221;&lt;br /&gt;
&amp;#169; &lt;a href="http://patternsinfp.wordpress.com/2011/01/31/lenses-are-the-coalgebras-for-the-costate-comonad/"&gt;Patterns in Functional Programming&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Недавно подкинули ссылку на презентацию &lt;a href="http://comonad.com/"&gt;Кметта&lt;/a&gt; по Lenses (&lt;a href="http://paste.pocoo.org/show/512163/"&gt;код к видео&lt;/a&gt;):&lt;br /&gt;
&lt;iframe width="640" height="360" src="http://www.youtube.com/embed/videoseries?list=PLEDE5BE0C69AF6CCE&amp;amp;hl=en_US" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Весьма интересно. Разбираясь на досуге со scalaz, полез искать, что там для этого есть. Нашёл &lt;a href="http://scalaz.github.com/scalaz/scalaz-2.9.0-1-6.0/doc.sxr/scalaz/Lens.scala.html"&gt;имплементацию&lt;/a&gt; и ещё одну интересную штуку из той же оперы, &lt;a href="http://en.wikipedia.org/wiki/Zipper_%28data_structure%29"&gt;Zippers&lt;/a&gt;. В scalaz есть Zipper &lt;a href="http://scalaz.github.com/scalaz/scalaz-2.9.0-1-6.0/doc.sxr/scalaz/Zipper.scala.html"&gt;для Stream&lt;/a&gt; и &lt;a href="http://scalaz.github.com/scalaz/scalaz-2.9.0-1-6.0/doc.sxr/scalaz/TreeLoc.scala.html"&gt;для Tree&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Show me the code!&lt;/h4&gt;
&lt;p&gt;Работа с Lenses выглядит как-то так:&lt;br /&gt;
&lt;script src="https://gist.github.com/1404336.js?file=lens.scala"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;С Zipper &amp;#8212; так:&lt;br /&gt;
&lt;script src="https://gist.github.com/1404336.js?file=zipper.scala"&gt;&lt;/script&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/T4Re4cuFtfA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/11/29/PartialUpdate</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Haskell Mascot</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/nJfRrBXuHro/HaskellMascot" />
   <updated>2011-11-22T00:00:00-08:00</updated>
   <id>http://www.folone.info/2011/11/22/HaskellMascot</id>
   <content type="html">&lt;p&gt;Похоже, у Хаскелля таки &lt;a href="https://groups.google.com/forum/#!topic/haskell-cafe/TbwUHtfqs6I"&gt;будет маскот&lt;/a&gt; (не &lt;a href="http://www.haskell.org/pipermail/haskell/2009-April/021173.html"&gt;коала&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;iframe class="imgur-album" width="100%" height="550" frameborder="0" src="http://imgur.com/a/9x83t/embed"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt;:&lt;/b&gt; &lt;a href="http://open.spreadshirt.com/"&gt;магазин&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/nJfRrBXuHro" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/11/22/HaskellMascot</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Диаграмма Классов Типов</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/ey1mZtUlsXU/TypeClasses" />
   <updated>2011-11-16T00:00:00-08:00</updated>
   <id>http://www.folone.info/2011/11/16/TypeClasses</id>
   <content type="html">&lt;p&gt;Почитав на досуге &lt;a href="http://www.haskell.org/haskellwiki/Typeclassopedia"&gt;Типоклассопедию&lt;/a&gt;, соорудил диаграммку по мотивам &lt;a href="http://www.haskell.org/wikiupload/d/df/Typeclassopedia-diagram.png"&gt;представленной в ней&lt;/a&gt;, для собственного  удобства.&lt;br /&gt;
Вдруг кому пригодится, вот &lt;a href="http://dl.dropbox.com/u/4274210/typeclasses.png"&gt;ссылка&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;!--&lt;iframe width="585" height="500" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://www.piritiles.com/map/6796834?embed=1"&gt;&lt;/iframe&gt;--&gt;&lt;br /&gt;
&lt;iframe frameborder="0" width="585" height="500"  scrolling="no" marginheight="0" marginwidth="0" src="http://mashupforge.com/563/Ud6nnMatrSfFpJLyyvAm0zW0wAjFQy/?embed=1"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/ey1mZtUlsXU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/11/16/TypeClasses</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Небольшая заметка о комбинаторе неподвижной точки на Scala</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/_q6bGfbuq0M/FixedPointCombinator" />
   <updated>2011-09-21T00:00:00-07:00</updated>
   <id>http://www.folone.info/2011/09/21/FixedPointCombinator</id>
   <content type="html">&lt;p&gt;Недавно меня натолкнули на интересную тему &lt;a href="http://comonad.com/reader/2009/recursion-schemes/"&gt;рекурсивных схем&lt;/a&gt;. В процессе поглощения информации набросал yet another fixed point combinator на скале.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="c1"&gt;// По определению, в лоб:&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;](&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;_:T&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Ну и чтобы проверить, классический хелловорлд:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="n"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res0&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;К сожалению, популярный&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="haskell"&gt;&lt;span class="kt"&gt;Yk&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;L&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="err"&gt;λ&lt;/span&gt;&lt;span class="n"&gt;abcdefghijklmnopqstuvwxyzr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;на скале описать не получится: максимальное количество параметров у функции &amp;#8212; 22.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Бонус&lt;/strong&gt; &amp;#8212; &lt;a href="http://apocalisp.wordpress.com/2011/01/13/simple-ski-combinator-calculus-in-scalas-type-system/"&gt;&lt;span class="caps"&gt;SKI&lt;/span&gt;-calculus на скале&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://spl.smugmug.com/Humor/Lambdacats/13227630_eKt46#960824968_hNkLy"&gt;&lt;img src="http://spl.smugmug.com/Humor/Lambdacats/i-can-has-catamorfizm/960824968_hNkLy-O-1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/_q6bGfbuq0M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/09/21/FixedPointCombinator</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Ещё одно решение задачки про математиков</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/_bfVqv5YxQc/MathematicsDialog" />
   <updated>2011-08-04T00:00:00-07:00</updated>
   <id>http://www.folone.info/2011/08/04/MathematicsDialog</id>
   <content type="html">&lt;p&gt;Задачу уже несколько раз &lt;a href="http://users.livejournal.com/_darkus_/592464.html"&gt;пережевали&lt;/a&gt;. Тем не менее, я всё же тоже выложу свой вариант, на скале, &amp;#8220;в лоб&amp;#8221;.&lt;/p&gt;
&lt;h3&gt;Условие:&lt;/h3&gt;
&lt;blockquote&gt;Встречаются два математика, не видевшиеся много лет. Расспрашивают друг друга о житии-бытии, и в ходе разговора происходит следующий разговор:&lt;br /&gt;
&lt;br /&gt;
- Дети-то есть?&lt;br /&gt;
- Да, трое сыновей.&lt;br /&gt;
- И сколько же им лет?&lt;br /&gt;
- Ну ты же математик, попробуй сам рассчитать. Если перемножить их возрасты, то получится 36.&lt;br /&gt;
- Недостаточно информации.&lt;br /&gt;
- Сумма их возрастов равна номеру вон того троллейбуса.&lt;br /&gt;
- Опять недостаточно информации.&lt;br /&gt;
- Младший — рыжий.&lt;br /&gt;
- Теперь всё понятно!&lt;br /&gt;
&lt;br /&gt;
Назовите возраст детей.&lt;/blockquote&gt;
&lt;p&gt;Сначала сгенерим список нужных кортежей:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="n"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;toList&lt;/span&gt;

&lt;span class="n"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flatMap&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="n"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="n"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;}&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="o"&gt;}&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="n"&gt;flatten&lt;/span&gt;

&lt;span class="n"&gt;res9&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;scala.collection.immutable.List&lt;/span&gt;&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Первое условие &amp;#8212; произведение:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="n"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;res12&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;scala.collection.immutable.List&lt;/span&gt;&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Группируем по суммам:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="n"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res12&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupBy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_3&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;res13&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;scala.collection.immutable.Map&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;,&lt;span class="kt"&gt;scala.collection.immutable.List&lt;/span&gt;
&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)]]&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Условие суммы оказалось недостаточным, значит номер троллейбуса &amp;#8212; 13:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="n"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;res13&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;res21&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;scala.collection.immutable.Map&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;,&lt;span class="kt"&gt;scala.collection.immutable.List&lt;/span&gt;
&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)]]&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;res21&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flatten&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_2&lt;/span&gt;
     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;res22&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;, &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Правильный ответ &amp;#8212; &lt;code&gt;(1,6,6)&lt;/code&gt;. Впрочем, если придираться, по чисто человеческим причинам второй ответ тоже проходит.&lt;/p&gt;
&lt;p&gt;Как-то так.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/_bfVqv5YxQc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/08/04/MathematicsDialog</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Emacs setup for scala</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/IAP6H8JQIP8/Emacs-setup-for-scala" />
   <updated>2011-08-03T00:00:00-07:00</updated>
   <id>http://www.folone.info/2011/08/03/Emacs-setup-for-scala</id>
   <content type="html">&lt;p&gt;&lt;img src="http://1.bp.blogspot.com/_A7vd1oW85hU/Rod-V4fAaxI/AAAAAAAABHw/jIiZMPqiw7U/s320/IMG_2415.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Многие, кто начинает пробовать работать на скале, после того как дойдут до создания чего-то большего, чем джейсон парсер, начинают задаваться вопросом выбора среды разработки. Обычно эти поиски заканчиваются разочарованием: эклипс глючный, идея не умеет выводить типы для всего, сложнее вышеупомянутого джейсон парсера и перекрашивает кучу валидного кода красным, нетбинз тоже оставляет желать лучшего. Я некоторое время тому открыл для себя емакс. Последний год я использовал его исключительно как органайзер и джаббер-клиент. Но когда сменил работу на имеющую отношение к скале и настало время выбрать среду разработки, вспомнил о своём &amp;#8220;джаббер-клиенте&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Быстрый гуглёж показал, что существует некий &lt;a href="http://aemon.com/file_dump/ensime_manual.html"&gt;ensime-mode&lt;/a&gt;. Вопреки устоявшемуся мнению насчёт емакса вообще и его конфигов в частности, установить и начать играться с этой штукой проще простого.&lt;/p&gt;
&lt;p&gt;Я пользуюсь emacs starter kit&amp;#8217;ом. Правда, уже не помню, каким именно: на каждом новом компьютере я просто делаю &lt;code&gt;sudo apt-get install emacs&lt;/code&gt;, после чего копирую свою забекапленную директорию &lt;code&gt;.emacs.d&lt;/code&gt; в &lt;code&gt;~&lt;/code&gt;. Если вы ещё не выбрали себе стартер-кит, советую обратить внимание на &lt;a href="https://github.com/zahardzhan/emacs-starter-kit"&gt;вот этот&lt;/a&gt; (немного о нём &lt;a href="http://zahardzhan.github.com/2010/emacs-starter-kit-the-program.html"&gt;там&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Итак, после установки емакса, &lt;a href="http://www.scala-lang.org/node/201"&gt;ставим скалу&lt;/a&gt;. В директории &lt;code&gt;$SCALA_HOME/misc/scala-tool-support&lt;/code&gt; есть директория &lt;code&gt;emacs&lt;/code&gt;. Копируем её содержимое в &lt;code&gt;~/.emacs.d/scala-mode&lt;/code&gt;. Качаем новенькую версию &lt;a href="https://github.com/aemoncannon/ensime/downloads"&gt;ensime-mode&lt;/a&gt; и распаковываем её в &lt;code&gt;~/.emacs.d/ensime&lt;/code&gt;. Дальше открываем свой &lt;code&gt;custom.el&lt;/code&gt; (&lt;code&gt;init.el&lt;/code&gt; для тех, кто не пользуется starter-kit&amp;#8217;ами), и добавляем туда следующее:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scheme"&gt;&lt;span class="c1"&gt;;; Load scala mode&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-list&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;load-path&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="nv"&gt;dotfiles-dir&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/scala-mode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;scala-mode-auto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;;; Load ensime mode&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-list&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;load-path&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="nv"&gt;dotfiles-dir&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/ensime/elisp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;ensime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;;; This step causes the ensime-mode to be started whenever&lt;/span&gt;
&lt;span class="c1"&gt;;; scala-mode is started for a buffer.&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-hook&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;scala-mode-hook&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;ensime-scala-mode-hook&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;exec-path&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;append &lt;/span&gt;&lt;span class="nv"&gt;exec-path&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/path-to-scala/scala-2.9.0.1/bin&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Далее импортируем (или создаём новый) проект: выполняем &lt;code&gt;M-x ensime&lt;/code&gt; и следуем инструкциям. После того как ензим создал файл описания проекта (&lt;code&gt;.ensime&lt;/code&gt;), выполняем &lt;code&gt;M-x ensime&lt;/code&gt; ещё раз, указав расположение нашего нового файла, ждём, когда всё подгрузится и стартанёт. Ензим встретит нас чем-то вроде &lt;code&gt;Hacks and glory await!&lt;/code&gt;. Теперь можно смело начинать кодить. Автокомплит вызывается TAB&amp;#8217;ом, полный список команд и клавиатурных сокращений &amp;#8212; &lt;a href="http://aemon.com/file_dump/ensime_manual.html#tth_sEc4.11"&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;К слову, список фраз-приветствий энзима можно посмотреть (и дополнить) в файле &lt;code&gt;ensime.el&lt;/code&gt;. Стандартное содержание выглядит следующим образом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scheme"&gt;&lt;span class="c1"&gt;;;; Words of encouragement&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;ensime-user-first-name&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;user-full-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
		  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;user-login-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
		&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;user-full-name&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string-match&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;^[^ ]*&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;capitalize&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;match-string&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defvar&lt;/span&gt; &lt;span class="nv"&gt;ensime-words-of-encouragement&lt;/span&gt;
  &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Let the hacking commence!&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;Hacks and glory await!&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;Hack and be merry!&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;May the source be with you!&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;Death to null!&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;Find closure!&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;May the _ be with you.&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;M-x be_cool&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;CanBuildFrom[List[Dream], Reality, List[Reality]]&amp;quot;&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%s, this could be the start of a beautiful program.&amp;quot;&lt;/span&gt;
	     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ensime-user-first-name&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;Scientifically-proven optimal words of hackerish encouragement.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;ensime-random-words-of-encouragement&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;Return a string of hackerish encouragement.&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;eval &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;length &lt;/span&gt;&lt;span class="nv"&gt;ensime-words-of-encouragement&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
	     &lt;span class="nv"&gt;ensime-words-of-encouragement&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Удачи.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/IAP6H8JQIP8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/08/03/Emacs-setup-for-scala</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 <entry>
   <title>Monad Tutorials</title>
   <link href="http://feedproxy.google.com/~r/folone/fp/~3/vB4la1xN5zQ/MonadTutorials" />
   <updated>2011-08-01T00:00:00-07:00</updated>
   <id>http://www.folone.info/2011/08/01/MonadTutorials</id>
   <content type="html">&lt;p align="right"&gt;&amp;#8220;A monad in X is just a monoid in the category of endofunctors of X&amp;#8221;&lt;br /&gt;
&amp;#169; &lt;a href="http://books.google.com/books?id=MXboNPdTv7QC&amp;amp;pg=PA138&amp;amp;dq=%22monoid+in+the+category+of+endofunctors%22+mac+lane&amp;amp;hl=en&amp;amp;ei=RlYcTqyFBpOs8QO2qY2MCA&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1&amp;amp;ved=0CCwQ6AEwAA#v=onepage&amp;amp;q=%22a%20monad%20in%20X%20is%20just%20a%20monoid%20in%20the%20category%20of%20endofunctors%20of%20X%22&amp;amp;f=false"&gt;Categories for the working mathematician&lt;/a&gt; By Saunders Mac Lane&lt;/p&gt;
&lt;p&gt;Одна из самых загадочных и, в то же время, интересных штукенций в мире этого вашего хаскелля для новичка &amp;#8212; это, конечно же, монады. Тут сказывается и замысловатое название, и тот факт, что штука эта взята из очень теоретического раздела математики.&lt;/p&gt;
&lt;p&gt;Я не буду проходить обряд инициации и писать о них, без меня достаточно написано, что важно, гораздо более умными людьми. Вместо этого, черкну о самих туториалах.&lt;/p&gt;
&lt;p&gt;Так вот, как по мне, существующие туториалы по монадам делятся на три группы:&lt;/p&gt;
&lt;h3&gt;Вырабатывающие интуицию&lt;/h3&gt;
&lt;p&gt;Такие туториалы обычно рассказывают по очереди об известных монадах &lt;a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t:Maybe"&gt;Maybe&lt;/a&gt;, &lt;a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t:Either"&gt;Either&lt;/a&gt;, &lt;a href="http://www.haskell.org/haskellwiki/State_Monad"&gt;State&lt;/a&gt;, &lt;a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html"&gt;List&lt;/a&gt;. Из известных мне отличных туториалов:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Евгений Кирпичёв &lt;a href="http://www.rsdn.ru/article/funcprog/monad.xml"&gt;Монады&lt;/a&gt; &amp;#8212; помимо разбора стандартных инстансов монад, также описывается интуиция к постоению своих монад.&lt;/li&gt;
	&lt;li&gt;John Millikin &lt;a href="https://john-millikin.com/articles/monad-is-not-difficult/"&gt;Monad is not difficult&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Dan Piponi &lt;a href="http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html"&gt;You could have invented monads&lt;/a&gt; &amp;#8212; привычные монады не описываются, тем не менее, даётся интуиция для создания &amp;#8220;чего-то вроде&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;Burak Emir &lt;a href="http://lamp.epfl.ch/~emir/bqbase/2005/01/20/monad.html"&gt;Monads in Scala&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Впрочем, последняя статья скорей проводит параллели между монадными функциями и do-нотацией хаскелля и соответствующими функциями и for-нотацией в скале.&lt;/p&gt;
&lt;h3&gt;Построенные на ассоциациях&lt;/h3&gt;
&lt;p&gt;Такие туториалы обычно сравнивают монады с разными более простыми (?) концепциями. Например, с:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://codetojoy.blogspot.com/2009/03/monads-are-burritos.html"&gt;Буритос&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Слонами (&lt;a href="http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html"&gt;1&lt;/a&gt;, &lt;a href="http://james-iry.blogspot.com/2007/10/monads-are-elephants-part-2.html"&gt;2&lt;/a&gt;, &lt;a href="http://james-iry.blogspot.com/2007/10/monads-are-elephants-part-3.html"&gt;3&lt;/a&gt;, &lt;a href="http://james-iry.blogspot.com/2007/11/monads-are-elephants-part-4.html"&gt;4&lt;/a&gt;) &amp;#8212; очень годный туториал, имхо.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://telofy.soup.io/post/23797479/Think-of-a-monad-as-a-spacesuit"&gt;Космическим костюмом, заполненным радиацией в океане рядом с яблоками&lt;/a&gt; (омфг).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В начале такие туториалы действительно воспринимаются лучше, так как глядя на все эти коммутативные диаграммы, становится страшно.&lt;/p&gt;
&lt;h3&gt;Объясняющие концепции из теорката&lt;/h3&gt;
&lt;p&gt;Самые годные, но требующие наибольшей концентрации туториалы.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://raichoo.blogspot.com/2011/07/from-functions-to-monads-in-scala.html"&gt;From Functions to Monads in Scala&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/Haskell/Category_theory"&gt;Haskell/Category theory&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Catsters, серии про монады (&lt;a href="http://www.youtube.com/watch?v=9fohXBj2UEI"&gt;1&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=Si6_oG7ZdK4"&gt;2&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=eBQnysX7oLI"&gt;3&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=uYY5c1kkoIo"&gt;3A&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=Cm-O_ZWEIGY"&gt;4&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;Dominic Verity &lt;a href="http://vimeo.com/17207564"&gt;Gentle Introduction to Category Theory&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Сюда ещё относится &lt;a href="http://kodt-rsdn.livejournal.com/94016.html?thread=287552#t287552"&gt;объяснение от Паши&lt;/a&gt;, которое ни разу не туториал в привычном виде, но которое мне в каком-то смысле помогло понять цитату в начале поста.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;К слову, есть ещё нестандартные туториалы. Например, &lt;a href="http://www.haskell.org/haskellwiki/What_a_Monad_is_not"&gt;What a Monad is not&lt;/a&gt;. Ну и чтобы по сто раз не писать, есть ещё и &lt;a href="http://www.haskell.org/haskellwiki/Monad_tutorials_timeline"&gt;таймлайн&lt;/a&gt; особо хороших монадных туториалов. Enjoy.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Прочитав пару дюжин статей про монады, и переписав где возможно код своего проекта (скала) в монадическом стиле, я всё ещё не могу с уверенностью сказать, что я понимаю монады.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;Такие дела.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://spl.smugmug.com/Humor/Lambdacats/13227630_eKt46#960526421_MnNqB"&gt;&lt;img src="http://spl.smugmug.com/Humor/Lambdacats/trapd-in-IO-monad-plz-help/960526421_MnNqB-O-1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/folone/fp/~4/vB4la1xN5zQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.folone.info/2011/08/01/MonadTutorials</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
</feed>

