<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>Форум 'Декларативное программирование' на RSDN.RU</title>
    <link>http://www.rsdn.ru/Forum/decl/</link>
    <description>Функциональные и логические языки программирования, декларативные расширения императивных языков и другие средства повышения уровня абстракции языков программирования.</description>
    <category>decl</category>
    <language>ru-ru</language>
    <copyright>Copyright ©, RSDN.ru, 2001-2007</copyright>
    <webMaster>webmaster@rsdn.ru</webMaster>
    <generator>RSDN RSS Generator 1.3</generator>
    <image>
      <url>http://www.rsdn.ru/rsdn.gif</url>
      <title>RSDN.RU</title>
      <link>http://www.rsdn.ru</link>
    </image>
    <lastBuildDate>Sun, 12 Feb 2012 20:00:25 GMT</lastBuildDate>
    <ttl>5</ttl>
	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rsdn/decl" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rsdn/decl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Fun with Lisp: Programming the NES</title>
		<link>http://www.rsdn.ru/Forum/decl/4613305.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4613305.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4613305.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4613305</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4613305.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4613305</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Здравствуйте.&lt;br /&gt;
&lt;br /&gt;
Интересный &lt;a href="http://ahefner.livejournal.com/20528.html" class="m" target="_blank"&gt;пример метапрограммирования&lt;/a&gt;. Особенно для любителей низкоуровневых вещей. Давно такой искал.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/nSfmQm_3L-I" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Sat, 11 Feb 2012 07:12:12 GMT</pubDate>
		
			<author>frontsquat &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>[Haskell] Вышел пьяный компилятор Хаскеля 7.4.1</title>
		<link>http://www.rsdn.ru/Forum/decl/4607837.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4607837.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4607837.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4607837</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4607837.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4607837</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Информация где обычно.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/ado12A2DLTw" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Tue, 07 Feb 2012 14:52:52 GMT</pubDate>
		
			<author>Паблик Морозов &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>19</slash:comments>
		
	</item>

	<item>
		<title>Clojure + Android</title>
		<link>http://www.rsdn.ru/Forum/decl/4603555.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4603555.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4603555.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4603555</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4603555.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4603555</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Здравствуйте.&lt;br /&gt;
&lt;br /&gt;
Есть ли тут андроидописатели? Насколько реально на практике использовать Clojure или ClojureScript на Android?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/ncKFZiQhCYA" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Sat, 04 Feb 2012 14:47:50 GMT</pubDate>
		
			<author>frontsquat &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>4</slash:comments>
		
	</item>

	<item>
		<title>[Haskell] рекуррентная последовательность в списке</title>
		<link>http://www.rsdn.ru/Forum/decl/4603264.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4603264.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4603264.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4603264</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4603264.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4603264</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Есть список, в котором находится рекуррентная последовательность.&lt;br /&gt;
Требуется получить 1 элемент последовательности с большим номером.&lt;br /&gt;
&lt;br /&gt;
Пытаюсь сделать так:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
func = lst !! 1000000 &lt;span class='com'&gt;-- any big number&lt;/span&gt;
    &lt;span class='kw'&gt;where&lt;/span&gt;
        lst = iterate (+1) 0 &lt;span class='com'&gt;-- sample of sequence&lt;/span&gt;

main = putStrLn $ show func&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
При попытке выполнить падает из-за нехватки стека. Как изменить код, чтобы не падал?&lt;br /&gt;
(Увеличить размер стека не предлагать)&lt;br /&gt;
&lt;br /&gt;
Есть вариант использовать ф-ю&lt;br /&gt;
 &lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
strictGet cnt lst@(val:tl) = &lt;span class='kw'&gt;if&lt;/span&gt; cnt &amp;gt; 0 &lt;span class='kw'&gt;then&lt;/span&gt; val `seq` strictGet (cnt-1) tl &lt;span class='kw'&gt;else&lt;/span&gt; val&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Но такое решение не нравится. Как можно по другому?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/4q1S2TRoul4" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Sat, 04 Feb 2012 09:56:47 GMT</pubDate>
		
		
			<slash:comments>15</slash:comments>
		
	</item>

	<item>
		<title>[ANN][F#] WebSharper стал Open-Source</title>
		<link>http://www.rsdn.ru/Forum/decl/4602058.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4602058.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4602058.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4602058</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4602058.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4602058</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Новость трехнедельной давности, но как-то здесь прошла незамеченной.&lt;br /&gt;
&lt;br /&gt;
Последняя версия бибилиотеки &lt;a href="http://websharper.com/home" class="m" target="_blank"&gt;WebSharper&lt;/a&gt; 2.4 основанной на компиляции F#-to-JavaScript стала Open-Source.&lt;br /&gt;
Модель лицензирования двойная: или AGPL со всеми вытекающими ограничениями или коммерческая лицензия.&lt;br /&gt;
Исходники &lt;a href="https://bitbucket.org/IntelliFactory/websharper" class="m" target="_blank"&gt;здесь&lt;/a&gt;.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.2.0 alpha 5 rev. 1536&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/KJbsJBSFilw" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Fri, 03 Feb 2012 08:23:01 GMT</pubDate>
		
			<author>Димчанский &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Игрушечный SQL-образный DSL</title>
		<link>http://www.rsdn.ru/Forum/decl/4599406.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4599406.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4599406.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4599406</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4599406.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4599406</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Разбираюсь с макросистемой racket'a. Пишу &lt;a href="https://bitbucket.org/ib_soft/racket-samples/src/6fb7234311de/sql-dsl" class="m" target="_blank"&gt;SQL-образный DSL&lt;/a&gt;&lt;br /&gt;
Хочу проверять поля в where-clause на наличие у сущности, для которой делается запрос. И делать это на этапе компиляции.&lt;br /&gt;
Сейчас сущность объявляется как&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
(define-entity user 
  user_table (id name))&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Что разворачивается в &lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
(define entity 
  (hash 'table 'user_table
        'fields '(id name)))&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
И проверка работает только в runtime.&lt;br /&gt;
Т.е. при попытке обратится из syntax-case приводит к&lt;br /&gt;
reference to an identifier before its definition: user phase: 1 (which cannot access the run-time definition)&lt;br /&gt;
Как бы выйти из этой ситуации?&lt;br /&gt;
Использовать для определения сущности define-for-syntax?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/gCEKEtCUOhQ" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Wed, 01 Feb 2012 15:53:29 GMT</pubDate>
		
			<author>Danila_a &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>2</slash:comments>
		
	</item>

	<item>
		<title>скриптование на lisp</title>
		<link>http://www.rsdn.ru/Forum/decl/4595218.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4595218.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4595218.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4595218</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4595218.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4595218</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Для программы понадобилась система скриптования. Хочу попробовать для этого использовать lisp. Подскажите, что для этого нужно использовать.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/1BIghojUP8M" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Mon, 30 Jan 2012 04:13:27 GMT</pubDate>
		
			<author>monax &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Visual basic наследник ML?</title>
		<link>http://www.rsdn.ru/Forum/decl/4591040.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4591040.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4591040.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4591040</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4591040.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4591040</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Не раз видел упоминания об этом факте, в частности здесь &lt;a href="http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html" class="m" target="_blank"&gt;http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html&lt;/a&gt; &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='q'&gt;&lt;p&gt;1973 &amp;mdash; Robin Milner creates ML, a language based on the M&amp;amp;M type theory. ML begets SML which has a formally specified semantics. When asked for a formal semantics of the formal semantics Milner's head explodes. Other well known languages in the ML family include OCaml, F#, and Visual Basic.&lt;/p&gt;&lt;/blockquote&gt;
&lt;br /&gt;
В упор не вижу, чего там взято из ML  &lt;img border='0' width='15' height='22' src='http://www.rsdn.ru/Forum/images/confused.gif' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/plOEnpLQzGo" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Thu, 26 Jan 2012 07:33:08 GMT</pubDate>
		
			<author>achmed &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>[Scala] Почему не компилируется</title>
		<link>http://www.rsdn.ru/Forum/decl/4576394.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4576394.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4576394.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4576394</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4576394.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4576394</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Привет!&lt;br /&gt;
&lt;br /&gt;
Читаю главу 35 Programming in Scala, 2e. Там есть такой пример:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;import&lt;/span&gt; scala.util.parsing.combinator._

object FormulaParser &lt;span class='kw'&gt;extends&lt;/span&gt; RegexParsers {
  def number : Parser[Number] = decimal ^^ ( d =&amp;gt; Number(d.toDouble) ) &lt;span class='com'&gt;// так компилируется


/* а вот так - нет, ошибка
   error: missing parameter type for expanded function ((x$1) =&amp;gt; x$1.toDouble)
   def number : Parser[Number] = decimal ^^ ( Number(_.toDouble) )
*/&lt;/span&gt;  
  def number : Parser[Number] = decimal ^^ ( Number(_.toDouble) )
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Не понимаю, почему. &lt;br /&gt;
&lt;br /&gt;
^^ определен в библиотеке как &lt;br /&gt;
def ^^ [U](f: T =&amp;gt; U): Parser[U]&lt;br /&gt;
&lt;br /&gt;
Пробовал на простом примере со своим классом, определяющим ^^, там прокатывают оба варианта  &lt;img border='0' width='15' height='22' src='http://www.rsdn.ru/Forum/images/confused.gif' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/kD56Gew6lOk" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Sat, 14 Jan 2012 16:41:16 GMT</pubDate>
		
			<author>enji &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Монады и Uniqueness_type или Haskell, Clean и C#</title>
		<link>http://www.rsdn.ru/Forum/decl/4576031.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4576031.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4576031.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4576031</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4576031.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4576031</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Монады часто объясняют как абстрактную математическую штуку, и редко рассказывают, а что же это такое с точки зрения программиста, а так же с точки зрения реализации.&lt;br /&gt;
&lt;br /&gt;
чисто-функциональные языки имеют особенность: в них нельзя из ничего делать что-то, а из что-то делать ничего. в первом случае &amp;mdash; нарушается принцип чистой функции &amp;mdash; что одному значению входа должно соответствовать одно значение выхода, а во втором случае &amp;mdash; использование приципа "вызов функции может быть заменен на ее результат" приводит к тому, что вызов такой функции сразу заменяется на ничего.&lt;br /&gt;
Соответственно, когда возникает необходимость читать из внешнего мира(и функция выглядит как: из ничего делается что-то) или писать (функция выглядит как: что-то превращается в ничто) во внешний мир, то возникает необходимость записать для компилятора эти особые случаи.&lt;br /&gt;
&lt;br /&gt;
в первом приближении, вид функций _getline и _putline можно записать как: &lt;br /&gt;
(stream, line) _getline(stream),&lt;br /&gt;
stream _putline(stream, line).&lt;br /&gt;
При такой записи уже нет проблем с переходами что-то в ничего, и ничего во что-то, но из-за того, что компилятор имеет право переставлять местами вызовы возникает неопределенность в следующем коде: оба варианта вывода ab и ba получаются равнозначны.&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
stream F(stream)
{
  &lt;span class='kw'&gt;return&lt;/span&gt; L(_putline(stream, &lt;span class='str'&gt;"a"&lt;/span&gt;), _putline(stream, &lt;span class='str'&gt;"b"&lt;/span&gt;)); &lt;span class='com'&gt;//L - это произвольная функция вида (stream, stream) -&amp;gt; stream&lt;/span&gt;
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
руками ловить такие неопределенности неспортивно, и предлагается два способа решения этой проблемы:&lt;br /&gt;
1. &lt;a href="http://en.wikipedia.org/wiki/Uniqueness_type" class="m" target="_blank"&gt;Uniqueness type&lt;/a&gt;&lt;br /&gt;
в данном случае утверждается, что тип stream (или аналог) должен быть особым видом типов, для которых компилятор обязан проверять, что одно и тоже значение не используется два раза. и так сделано в Clean и Mercury.&lt;br /&gt;
и тогда на предыдущий код компилятор наругается, что переменная stream используется два раза, и заставит переписать его во что-нибудь типа:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
stream F(stream) {&lt;span class='kw'&gt;return&lt;/span&gt; _putline(_putline(stream, &lt;span class='str'&gt;"a"&lt;/span&gt;), &lt;span class='str'&gt;"b"&lt;/span&gt;);}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
2. &lt;a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)" class="m" target="_blank"&gt;Monad&lt;/a&gt;&lt;br /&gt;
во втором случае умные люди заметили, что если разрешить комбинировать только "названия" функций, а не сами вызовы, то ситуацию с неопределенностью вообще построить нельзя.&lt;br /&gt;
в этом случае, в языке разрешается вызывать вспомогательные функции getline и putline вместо исходных _getline и _putline:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
Func&amp;lt;stream, (stream, &lt;span class='kw'&gt;string&lt;/span&gt;)&amp;gt; getline = _getline; 
Func&amp;lt;stream, stream&amp;gt; putline(&lt;span class='kw'&gt;string&lt;/span&gt; line) {&lt;span class='kw'&gt;return&lt;/span&gt; stream =&amp;gt; _putline(stream, line);}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
тип функции getline "Func&amp;lt;stream, (stream, string)&amp;gt;" обозначают как IO string&lt;br /&gt;
тип функции putline "Func&amp;lt;string, Func&amp;lt;stream, stream&amp;gt;&amp;gt;" обозначают как string -&amp;gt; IO()&lt;br /&gt;
для комбинирования таких сложных типов добавляют две функции bind и return, а вызов типа "Func&amp;lt;stream, (stream, string)&amp;gt;" (и аналогичных) делается закрытым.&lt;br /&gt;
&lt;br /&gt;
при этом функции getline и putline могут быть описаны с помощью Uniqueness type&lt;br /&gt;
&lt;br /&gt;
Clean (или Mercury) мне лень ставить, поэтому приведу реализацию монады IO на C# (на Clean/Mercury код будет такой же с точностью до синтаксиса):&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
  &lt;span class='kw'&gt;class&lt;/span&gt; IO_Monad
  {

    &lt;span class='com'&gt;//внутренние реализации функций _getline, _putline, Main&lt;/span&gt;

    &lt;span class='kw'&gt;private static&lt;/span&gt; Tuple&amp;lt;IBaseIO, &lt;span class='kw'&gt;string&lt;/span&gt;&amp;gt; _getline(IBaseIO io)
    {
      &lt;span class='kw'&gt;var&lt;/span&gt; line = io.ReadLine();
      &lt;span class='kw'&gt;return new&lt;/span&gt; Tuple&amp;lt;IBaseIO, &lt;span class='kw'&gt;string&lt;/span&gt;&amp;gt;(io, line);
    }
    &lt;span class='kw'&gt;private static&lt;/span&gt; IBaseIO _putline(IBaseIO io, &lt;span class='kw'&gt;string&lt;/span&gt; line)
    {
      io.WriteLine(line);
      &lt;span class='kw'&gt;return&lt;/span&gt; io;
    }

    &lt;span class='kw'&gt;private static void&lt;/span&gt; Main()
    {
      main()(&lt;span class='kw'&gt;new&lt;/span&gt; ReaderWriterIO(Console.In, Console.Out));
    }

    &lt;span class='com'&gt;//доступные для использования объявления getline, putline, bind, return&lt;/span&gt;

    &lt;span class='kw'&gt;public static&lt;/span&gt; Func&amp;lt;IBaseIO, Tuple&amp;lt;IBaseIO, &lt;span class='kw'&gt;string&lt;/span&gt;&amp;gt;&amp;gt; getline = _getline;

    &lt;span class='kw'&gt;public static&lt;/span&gt; Func&amp;lt;IBaseIO, IBaseIO&amp;gt; putline(&lt;span class='kw'&gt;string&lt;/span&gt; line)
    {
      &lt;span class='kw'&gt;return&lt;/span&gt; io =&amp;gt; _putline(io, line);
    }

    &lt;span class='kw'&gt;public static&lt;/span&gt; Func&amp;lt;IBaseIO, Tuple&amp;lt;IBaseIO, T&amp;gt;&amp;gt; Return&amp;lt;T&amp;gt;(T a)
    {
      &lt;span class='kw'&gt;return&lt;/span&gt; IBaseIO =&amp;gt; Tuple.Create(IBaseIO, a);
    }
    &lt;span class='kw'&gt;public static&lt;/span&gt; Func&amp;lt;IBaseIO, Tuple&amp;lt;IBaseIO, Tb&amp;gt;&amp;gt; Bind&amp;lt;Ta, Tb&amp;gt;(Func&amp;lt;IBaseIO, Tuple&amp;lt;IBaseIO, Ta&amp;gt;&amp;gt; ma, Func&amp;lt;Ta, Func&amp;lt;IBaseIO, Tuple&amp;lt;IBaseIO, Tb&amp;gt;&amp;gt;&amp;gt; a_mb)
    {
      &lt;span class='kw'&gt;return&lt;/span&gt; io =&amp;gt;
        {
          &lt;span class='kw'&gt;var&lt;/span&gt; res = ma(io);
          &lt;span class='kw'&gt;return&lt;/span&gt; a_mb(res.Item2)(res.Item1);
        };
    }
    &lt;span class='kw'&gt;public static&lt;/span&gt; Func&amp;lt;IBaseIO, IBaseIO&amp;gt; Bind&amp;lt;Ta&amp;gt;(Func&amp;lt;IBaseIO, Tuple&amp;lt;IBaseIO, Ta&amp;gt;&amp;gt; ma, Func&amp;lt;Ta, Func&amp;lt;IBaseIO, IBaseIO&amp;gt;&amp;gt; a_mb)
    {
      &lt;span class='kw'&gt;return&lt;/span&gt; io =&amp;gt;
      {
        &lt;span class='kw'&gt;var&lt;/span&gt; res = ma(io);
        &lt;span class='kw'&gt;return&lt;/span&gt; a_mb(res.Item2)(res.Item1);
      };
    }

    &lt;span class='com'&gt;//программа&lt;/span&gt;

    &lt;span class='kw'&gt;static&lt;/span&gt; Func&amp;lt;IBaseIO, IBaseIO&amp;gt; main()
    {
      &lt;span class='kw'&gt;return&lt;/span&gt; Bind(getline, putline);
    }

    &lt;span class='com'&gt;//вспомогательные объявления для реализации функций _getline и _putline&lt;/span&gt;

    &lt;span class='kw'&gt;public interface&lt;/span&gt; IBaseIO
    {
      &lt;span class='kw'&gt;string&lt;/span&gt; ReadLine();
      &lt;span class='kw'&gt;void&lt;/span&gt; WriteLine(&lt;span class='kw'&gt;string&lt;/span&gt; line);
    }
    &lt;span class='kw'&gt;public class&lt;/span&gt; ReaderWriterIO:IBaseIO
    {
      &lt;span class='kw'&gt;public&lt;/span&gt; ReaderWriterIO(TextReader reader, TextWriter writer)
      {
        &lt;span class='kw'&gt;this&lt;/span&gt;.Reader = reader;
        &lt;span class='kw'&gt;this&lt;/span&gt;.Writer = writer;
      }
      &lt;span class='kw'&gt;public readonly&lt;/span&gt; TextReader Reader;
      &lt;span class='kw'&gt;public readonly&lt;/span&gt; TextWriter Writer;
    
      &lt;span class='kw'&gt;public string&lt;/span&gt;  ReadLine()
      {
           &lt;span class='kw'&gt;return&lt;/span&gt; Reader.ReadLine();
      }

      &lt;span class='kw'&gt;public void&lt;/span&gt;  WriteLine(&lt;span class='kw'&gt;string&lt;/span&gt; line)
      {
           Writer.WriteLine(line);
      }

    }
  }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/pHcGp8f2rCQ" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Sat, 14 Jan 2012 05:24:36 GMT</pubDate>
		
			<author>DarkGray &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>63</slash:comments>
		
	</item>

	<item>
		<title>[Scala] Как заставить map возвращать правильный тип</title>
		<link>http://www.rsdn.ru/Forum/decl/4569691.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4569691.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4569691.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4569691</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4569691.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4569691</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Привет&lt;br /&gt;
&lt;br /&gt;
Изучаю Programming in scala 2e, главу про создание собственных коллекций. Там есть такой пример:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;import&lt;/span&gt; collection.{IndexedSeqLike, IndexedSeqOptimized}
&lt;span class='kw'&gt;import&lt;/span&gt; collection.mutable.{ArrayBuffer, Builder}
&lt;span class='kw'&gt;import&lt;/span&gt; collection.generic.CanBuildFrom

sealed &lt;span class='kw'&gt;abstract class&lt;/span&gt; Base
&lt;span class='kw'&gt;case&lt;/span&gt; object A &lt;span class='kw'&gt;extends&lt;/span&gt; Base
&lt;span class='kw'&gt;case&lt;/span&gt; object T &lt;span class='kw'&gt;extends&lt;/span&gt; Base
&lt;span class='kw'&gt;case&lt;/span&gt; object G &lt;span class='kw'&gt;extends&lt;/span&gt; Base
&lt;span class='kw'&gt;case&lt;/span&gt; object U &lt;span class='kw'&gt;extends&lt;/span&gt; Base
object Base {
  &lt;span class='kw'&gt;private&lt;/span&gt; val arr = Array(A, T, G, U)
  &lt;span class='kw'&gt;private&lt;/span&gt; val map: Map[Base, Int] = Map(A -&amp;gt; 0, T -&amp;gt; 1, G -&amp;gt; 2, U -&amp;gt; 3)
  def fromInt(i : Int) : Base = arr(i)
  def toInt(b : Base) : Int = map(b)
}

&lt;span class='kw'&gt;final class&lt;/span&gt; RNA1 &lt;span class='kw'&gt;private&lt;/span&gt;(groups : Array[Long], val length : Int)
  &lt;span class='kw'&gt;extends&lt;/span&gt; IndexedSeq[Base]
  &lt;span class='kw'&gt;with&lt;/span&gt; IndexedSeqOptimized[Base, RNA1]
  &lt;span class='kw'&gt;with&lt;/span&gt; IndexedSeqLike[Base, RNA1]
  {
  
  &lt;span class='kw'&gt;import&lt;/span&gt; RNA1._

  override &lt;span class='kw'&gt;protected&lt;/span&gt;[&lt;span class='kw'&gt;this&lt;/span&gt;] def newBuilder = RNA1.newBuilder
  
  def apply(idx: Int) : Base = {
    &lt;span class='kw'&gt;if&lt;/span&gt; (idx &amp;lt; 0 || idx &amp;gt;= length)
      &lt;span class='kw'&gt;throw new&lt;/span&gt; IndexOutOfBoundsException
    val grp = groups(idx / PerElem)
    val grpNo = idx % PerElem
    val no = (grp &amp;gt;&amp;gt; (grpNo * Grp)) &amp;amp; Mask    
    Base.fromInt( no.toInt )    
  }
}

object RNA1 {
  &lt;span class='kw'&gt;private&lt;/span&gt; val Grp = 2
  &lt;span class='kw'&gt;private&lt;/span&gt; val Mask = 3
  &lt;span class='kw'&gt;private&lt;/span&gt; val PerElem = 64 / Grp
  
  def fromSeq(seq : Seq[Base]) : RNA1 = {
    val len = seq.length
    val groups = &lt;span class='kw'&gt;new&lt;/span&gt; Array[Long]( (len + PerElem - 1) / PerElem)
    &lt;span class='kw'&gt;var&lt;/span&gt; n = 0
    &lt;span class='kw'&gt;for&lt;/span&gt; (b &amp;lt;- seq) {
      groups(n / PerElem) += Base.toInt(b) &amp;lt;&amp;lt; ((n % PerElem) * Grp)
      n += 1
    }

    &lt;span class='kw'&gt;new&lt;/span&gt; RNA1(groups, len)
  }
  
  def apply(elems : Base*) : RNA1 = fromSeq(elems)

  &lt;span class='kw'&gt;private&lt;/span&gt; def newBuilder: Builder[Base, RNA1] = &lt;span class='kw'&gt;new&lt;/span&gt; ArrayBuffer[Base] mapResult fromSeq

  implicit def canBuildFrom: CanBuildFrom[RNA1, Base, RNA1] =
    &lt;span class='kw'&gt;new&lt;/span&gt; CanBuildFrom[RNA1, Base, RNA1] {
      def apply(from: RNA1) = newBuilder
      def apply() = newBuilder
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Теперь если сделать так&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
val rna1 = RNA1(A, A, T, G, U)
println(rna1 map  {&lt;span class='kw'&gt;case&lt;/span&gt; A =&amp;gt; G &lt;span class='kw'&gt;case&lt;/span&gt; b =&amp;gt; b  })&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
то мы получим &lt;b&gt;RNA1&lt;/b&gt;(G, G, T, G, U)&lt;br /&gt;
т.е. map вернет правильный тип (так как будет использован canBuildFrom из компаньона).&lt;br /&gt;
&lt;br /&gt;
А вот если сделать так:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
val rna1 &lt;b&gt;: Seq[Base]&lt;/b&gt; = RNA1(A, A, T, G, U)
println(rna1 map  {&lt;span class='kw'&gt;case&lt;/span&gt; A =&amp;gt; G &lt;span class='kw'&gt;case&lt;/span&gt; b =&amp;gt; b  })&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
то мы получим &lt;b&gt;Vector&lt;/b&gt;(G, G, T, G, U), т.е. map, вызванный для Seq[Base], вернет дефолтный динамический тип для IndexedSeq &amp;mdash; Vector.&lt;br /&gt;
&lt;br /&gt;
А как добиться того, чтобы и в этом случае вернулся правильный тип &amp;mdash; RNA1?&lt;br /&gt;
&lt;br /&gt;
&lt;div class='mod'&gt;10.01.12 11:13: Перенесено из 'Java'&lt;/div&gt;&lt;div class='mod'&gt;10.01.12 23:48: Перенесено модератором из 'Java' &amp;mdash; по просьбе автора &amp;mdash; Blazkowicz&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/-W4EHatFY9M" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Mon, 09 Jan 2012 12:49:16 GMT</pubDate>
		
			<author>enji &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>15</slash:comments>
		
	</item>

	<item>
		<title>overloading и система модулей</title>
		<link>http://www.rsdn.ru/Forum/decl/4567162.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4567162.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4567162.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4567162</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4567162.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4567162</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;В haskell есть классы типов, которые предоставляют обобщенный механизм перегрузки функций/операторов:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; Eq a &lt;span class='kw'&gt;where&lt;/span&gt;
    (==) :: a -&amp;gt; a -&amp;gt; &lt;span class='kw'&gt;Bool&lt;/span&gt;

&lt;span class='com'&gt;-- теперь можно объявить оператор '==' для любого типа&lt;/span&gt;
&lt;span class='kw'&gt;instance&lt;/span&gt; Eq &lt;span class='kw'&gt;Integer where&lt;/span&gt; 
    x == y = integerEq x y

&lt;span class='kw'&gt;instance&lt;/span&gt; Eq foo &lt;span class='kw'&gt;where&lt;/span&gt; 
    x == y = fooEq x y&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Подумалось &amp;mdash; а что если обобщить этот механизм еще больше, вынести на уровень модулей и представить в виде семантики конструкции open (далее псевдокод):&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;module&lt;/span&gt; Foo where
    (==) :: foo -&amp;gt; foo -&amp;gt; &lt;span class='kw'&gt;bool&lt;/span&gt;
    (==) = &amp;lt;реализация '==' для типа 'foo'&amp;gt;

&lt;span class='kw'&gt;module&lt;/span&gt; Bar where
    (==) :: bar -&amp;gt; bar -&amp;gt; &lt;span class='kw'&gt;bool&lt;/span&gt;
    (==) = &amp;lt;реализация '==' для типа 'bar'&amp;gt;

&lt;span class='kw'&gt;open&lt;/span&gt; Foo
&lt;span class='kw'&gt;open&lt;/span&gt; Bar

-- теперь в области видимости у нас есть две реализации функции, и компилятор выбирает подходящую в зависимости от контекста

cmpThree :: a -&amp;gt; a -&amp;gt; a -&amp;gt; &lt;span class='kw'&gt;bool&lt;/span&gt;
cmpThree a b c = (a == b) &amp;amp;&amp;amp; (b == c)&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Преимущество &amp;mdash; можно иметь несколько реализаций перегружаемых функций для одного типа, и легко переключаться между ними с помощью конструкции open. Если в языке есть некая система эффектов, выраженных в типах, то можно выбирать варианты функций в зависимости от эффекта аргумента &amp;mdash; скажем, можно иметь 2 реализации map для списков &amp;mdash; обычный и паралелльный (только для pure функций).&lt;br /&gt;
Непонятно, как быть при конфликте имен в случае совпадающих типов &amp;mdash; можно, например, объявить некую функцию "функцией по умолчанию", что будет полезным например для того же параллельного map.&lt;br /&gt;
Непонятно, какие ограничения должны быть для перегружаемых функций, например, должны ли они иметь одинаковый principal type, арность и т.п.&lt;br /&gt;
Так же очевидно, что не всегда компилятор сможет эффективно выводить типы (в зависимости от ограничений на перегрузку).&lt;br /&gt;
&lt;br /&gt;
Был бы очень благодарен, если кто-то укажет на существующие работы в области перегрузки функций, т.к. складывается впечатления, что кроме type classes и их расширений, никаких работ в данном направлении не было.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/25Jgp3lzFHc" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Thu, 05 Jan 2012 14:26:01 GMT</pubDate>
		
			<author>SilentNoise &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Неизменность объектов не напригает ли на практике ?</title>
		<link>http://www.rsdn.ru/Forum/decl/4566296.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4566296.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4566296.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4566296</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4566296.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4566296</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Сорри, но у меня ламмерский вопрос. Я сейчас пытаюсь разобраться с функциональщиной. С идеологическим выигрышем от неизменности объектов вроде всё понятно, но есть подозрения, что это явление может несколько нагибать при банальном кодировании, особенно на Эрганге. Например, отсутствие глобальных переменных или механизма замыканий на переменные выше по блоку кода заставляет проталкивать одни и те же параметры по функциям. Во-вторых, напр., требование только одиночного присваивания (или связывания со значением) подталкивает к коду вида:&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  State1 = some_func1(val1),&lt;br /&gt;
  State2 = some_func2(val2, State1),&lt;br /&gt;
  State3 = some_func3(val3, State2),&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
т.е., плодятся переменные для одних и тех же нужд. Хотя здесь есть защита от случайной порчи переменной, но, всё-таки, это некие проблемы при рефакторинге. В немерле, скале и им подобным есть полный арсенал императивщины, кложура тоже имеет некие глобальные объявления и контролируемую возможность правки "по месту". В хаскеле, имхо, эти проблемы менее выражены, он заставляет писать код "менее императивно", чем эрганг, т.е. дробить алгоритмы на составляющие функции, но для этого есть "let" и "where" объявления, чего нет в эрланге. Вроде бы, есть попытки упростить жизнь через монады (напр., монады состояний) и есть некий велосипед do-нотаций и для эрганга, но для неподготовленного это далеко не упрощение.&lt;br /&gt;
&lt;br /&gt;
В общем, нагибает ли кодирование в таком стиле, или это всё надуманно по неопытности ?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/wiOaWj1z9S8" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Wed, 04 Jan 2012 12:14:48 GMT</pubDate>
		
			<author>PSV100 &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>20</slash:comments>
		
	</item>

	<item>
		<title>Conduits</title>
		<link>http://www.rsdn.ru/Forum/decl/4564324.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4564324.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4564324.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4564324</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4564324.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4564324</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Iteratee уродские абсолютно (все, без исключения)&lt;br /&gt;
Поэтому когда я в следующий раз доберусь до компьютера, буду изучать &lt;a href="http://hackage.haskell.org/package/conduit-0.0.0.1" class="m" target="_blank"&gt;http://hackage.haskell.org/package/conduit-0.0.0.1&lt;/a&gt;&lt;br /&gt;
Надеюсь они мне понравятся больше, чем существующие Iteratee, иначе наверное свои придётся писать.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/nnFyX4O6YHE" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Fri, 30 Dec 2011 16:47:58 GMT</pubDate>
		
			<author>Паблик Морозов &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Барби-программист</title>
		<link>http://www.rsdn.ru/Forum/decl/4558632.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4558632.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4558632.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4558632</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4558632.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4558632</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;&lt;a href="http://www.my-barbie.ru/c/3/p/8/" class="m" target="_blank"&gt;http://www.my-barbie.ru/c/3/p/8/&lt;/a&gt; (третий абзац)&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/TRg_Iqw4_Io" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Mon, 26 Dec 2011 18:13:31 GMT</pubDate>
		
			<author>Паблик Морозов &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Вопрос про Applicative</title>
		<link>http://www.rsdn.ru/Forum/decl/4558308.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4558308.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4558308.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4558308</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4558308.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4558308</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Вопрос наверно дурацкий, но сам чего-то не осиливаю.&lt;br /&gt;
Если есть такой код:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
 &lt;span class='kw'&gt;import&lt;/span&gt; Control.Applicative
 &lt;span class='kw'&gt;import&lt;/span&gt; Data.Monoid
 
 &lt;span class='kw'&gt;newtype&lt;/span&gt; Constant a b = Constant { getConstant :: a }
                            &lt;span class='kw'&gt;deriving&lt;/span&gt; Show

 &lt;span class='kw'&gt;instance&lt;/span&gt; Functor (Constant a) &lt;span class='kw'&gt;where&lt;/span&gt;
    fmap f (Constant x) = Constant x

 &lt;span class='kw'&gt;instance&lt;/span&gt; (Monoid a) =&amp;gt; Applicative (Constant a) &lt;span class='kw'&gt;where&lt;/span&gt;
    pure _ = Constant mempty
    Constant x &amp;lt;*&amp;gt; Constant y = Constant (x `mappend` y)&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
То как это вообще может работать?&lt;br /&gt;
*Main&amp;gt; Constant (Sum 1) &amp;lt;*&amp;gt; Constant (Sum 2)&lt;br /&gt;
Constant {getConstant = Sum {getSum = 3}}&lt;br /&gt;
*Main&amp;gt; :t Constant (Sum 1)&lt;br /&gt;
Constant (Sum 1) :: Num a =&amp;gt; Constant (Sum a) b&lt;br /&gt;
&lt;br /&gt;
Ведь (&amp;lt;*&amp;gt;) :: f (a -&amp;gt; b) -&amp;gt; f a -&amp;gt; f b, то есть &amp;lt;*&amp;gt; требует на вход функцию в контексте, а здесь он получает совсем не функцию.&lt;br /&gt;
&lt;br /&gt;
И как пользоваться pure? Пытаюсь так:&lt;br /&gt;
&lt;br /&gt;
*Main&amp;gt; pure (Sum 1) &amp;lt;*&amp;gt; Constant (Sum 2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;interactive&amp;gt;:1:7:&lt;br /&gt;
    Couldn't match expected type `a0 -&amp;gt; b0' with actual type `Sum a1'&lt;br /&gt;
    In the return type of a call of `Sum'&lt;br /&gt;
    In the first argument of `pure', namely `(Sum 1)'&lt;br /&gt;
    In the first argument of `(&amp;lt;*&amp;gt;)', namely `pure (Sum 1)'&lt;br /&gt;
&lt;br /&gt;
Работает почему-то только так:&lt;br /&gt;
*Main&amp;gt; pure (\_-&amp;gt;Sum 1) &amp;lt;*&amp;gt; Constant (Sum 2)&lt;br /&gt;
Constant {getConstant = Sum {getSum = 2}}&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/YltOo4rqr2M" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Mon, 26 Dec 2011 13:35:38 GMT</pubDate>
		
			<author>HrorH &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Почему на Haskell получается так медленно?</title>
		<link>http://www.rsdn.ru/Forum/decl/4552562.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4552562.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4552562.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4552562</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4552562.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4552562</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Доброе время суток!&lt;br /&gt;
&lt;br /&gt;
Написали мы программу, которая находит первые N простых чисел и вычисляет их сумму. Написали на C и на Haskell. Алгоритм тупой, но суть в том, что он одинаковый. В результате, программа на C выполняет задачу за 4 с, а на Haskell -- за 54 c. Из опций стоит только -O2.&lt;br /&gt;
&lt;br /&gt;
Почему же такая разница? Привожу исходники:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;int&lt;/span&gt; isPrime( &lt;span class='kw'&gt;int&lt;/span&gt; num ) {
        &lt;span class='kw'&gt;int&lt;/span&gt; count = 0;
        &lt;span class='kw'&gt;int&lt;/span&gt; i = 1;
        &lt;span class='kw'&gt;for&lt;/span&gt;( ; i &amp;lt;= num ; ++i ) {
                &lt;span class='kw'&gt;if&lt;/span&gt;( num % i == 0 ) ++count;
        }
        &lt;span class='kw'&gt;return&lt;/span&gt; 2 == count;
}

&lt;span class='kw'&gt;#define&lt;/span&gt; COUNT 5000

&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;stdio.h&amp;gt;

&lt;span class='kw'&gt;int&lt;/span&gt; main( &lt;span class='kw'&gt;void&lt;/span&gt; ) {
        &lt;span class='kw'&gt;int&lt;/span&gt; count = 0;
        &lt;span class='kw'&gt;int&lt;/span&gt; num = 1;
        &lt;span class='kw'&gt;int&lt;/span&gt; sum = 0;
        &lt;span class='kw'&gt;for&lt;/span&gt;( ; count &amp;lt; COUNT ; ++num ) {
                &lt;span class='kw'&gt;if&lt;/span&gt;( isPrime( num ) ) {
                        sum += num;
                        ++count;
                }
        }
        printf( &lt;span class='str'&gt;"%d\n"&lt;/span&gt; , sum );
        &lt;span class='kw'&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
divisors num = filter (\i -&amp;gt; (mod num i) == 0 ) [1..num]

isPrime num = length (divisors num) == 2

firstPrimes count = take count (filter isPrime [1..])

count = 5000

main = print $ sum $ firstPrimes count&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Впрочем, видно, что вариант на Haskell весь из себя ленивый и использует списки. Я пробовал расставлять строгость (сначала обдуманно, потом где попало) -- не помогло. Затем я подглядел вариант с параметром-аккумулятором и получился вот такой (страшный) код:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
incDiv num i acc | mod num i == 0 = 1+acc
                 | otherwise      = acc

divisors num i acc | i &amp;lt;= num  = divisors num (i+1) (incDiv num i acc)
                   | otherwise = acc

isPrime' num = divisors num 1 0 == 2

primesSum count num acc | count &amp;gt; 0 = &lt;span class='kw'&gt;if&lt;/span&gt; isPrime' num
                                      &lt;span class='kw'&gt;then&lt;/span&gt; primesSum (count-1) (num+1) (num+acc)
                                      &lt;span class='kw'&gt;else&lt;/span&gt; primesSum count (num+1) acc
                        | otherwise  = acc

count = 5000

main = print (primesSum count 1 0)&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Однако я получил всё те же 54 с. Подскажите, пожалуйста, что я делаю не так, и возможно ли вообще в данном случае приблизить время исполнения к сишному варианту (хотя бы в два раза медленнее, но не в 13).&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
Спасибо за внимание!&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/TH66sq9aLKA" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Wed, 21 Dec 2011 19:04:34 GMT</pubDate>
		
			<author>Kirikaza &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>16</slash:comments>
		
	</item>

	<item>
		<title>yacc: правило по умолчанию</title>
		<link>http://www.rsdn.ru/Forum/decl/4544558.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4544558.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4544558.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4544558</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4544558.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4544558</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Вопрос по составлению yacc-граматики:&lt;br /&gt;
&lt;br /&gt;
У меня есть лексемы слов WORD и знаков препинания: DOT COMMA etc.&lt;br /&gt;
&lt;br /&gt;
Я составил правило, чтобы находить простые предложения:&lt;br /&gt;
&lt;br /&gt;
sentence_begin: WORD&lt;br /&gt;
&lt;br /&gt;
sentence_middle: sentence_begin &lt;br /&gt;
                 sentence_middle WHITESPACE WORD&lt;br /&gt;
                 sentence_middle COMMA WHITESPACE WORD&lt;br /&gt;
&lt;br /&gt;
sentence:  sentence_middle DOT&lt;br /&gt;
&lt;br /&gt;
Какое правило нужно добавить, чтобы в него попадали все варианты, которые не удовлетворяют данному правилу (fail_sentence)?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/Q0E4WPTrt8Y" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Fri, 16 Dec 2011 08:06:11 GMT</pubDate>
		
			<author>Hard_Club &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Yesod Haskell web framework</title>
		<link>http://www.rsdn.ru/Forum/decl/4542920.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4542920.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4542920.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4542920</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4542920.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4542920</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;&lt;blockquote class='q'&gt;&lt;p&gt;Yesod is a Haskell web framework for productive development of type-safe, RESTful, high performance web applications&lt;/p&gt;&lt;/blockquote&gt;
&lt;a href="http://www.yesodweb.com/" class="m" target="_blank"&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Кто-нибудь использовал/игрался? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='q'&gt;&lt;p&gt;Of course type-safety provides big productivity boosts by guaranteeing against typos or using wrong type in a function. But Yesod cranks this up a notch to guarantee common web application errors won't occur.&lt;br /&gt;
&lt;br /&gt;
    no XSS attacks &amp;mdash; user submissions are automatically sanitized&lt;br /&gt;
    no SQL injection &amp;mdash; sql queryies are automatically escaped&lt;br /&gt;
    database queries are always valid &amp;mdash; querying is done in Haskell and uses your schema&lt;br /&gt;
    valid template variables with proper template insertion- variable are known at compile time and treated differently according to their type&lt;br /&gt;
    type-safe urls &amp;mdash; say goodbye to broken links&lt;/p&gt;&lt;/blockquote&gt;
&lt;a href="http://www.yesodweb.com/page/about" class="m" target="_blank"&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
Побаловался я тут пару вечеров с yesod/haskell. &lt;br /&gt;
Вчера попробовал обновить через cabal (cabal install yesod). Выдало кучу ошибок с зависимостями.&lt;br /&gt;
ghc-pkg check выдает теперь yesod пакеты. &lt;br /&gt;
&lt;br /&gt;
Как мне сделать, чтобы опять стало все хорошо (чтобы поменьше работы было) &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt;? &lt;br /&gt;
Как мне делать, чтобы в будущем таких ошибок не повторялось?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/4novwx1K70U" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Thu, 15 Dec 2011 08:13:23 GMT</pubDate>
		
			<author>Alex912 &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>4</slash:comments>
		
	</item>

	<item>
		<title>структурная рекурсия на вьюхе (view) на натуральный ряд</title>
		<link>http://www.rsdn.ru/Forum/decl/4541864.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/decl/4541864.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/decl/4541864.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4541864</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4541864.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4541864</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;вот определение на псевдохаскеле:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
fi(1) = 1
fi( x*prime^n ) = fi(x) * prime^(n-1) * (prime-1)&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
здесь ^ это оператор возведения в степень, fi это &lt;a href="http://ru.wikipedia.org/wiki/Функция_Эйлера" class="m" target="_blank"&gt;Функция_Эйлера&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
как его максимально красиво написать на настоящем хаскеле (красиво -- значит сохранив паттерн-матчинг)?&lt;br /&gt;
&lt;br /&gt;
приблизительная идея: ввести тип данных Т, который будет представлять натуральные числа в виде произведения простых чисел в разных степенях, и уже для него сделать структурно-рекурсивное определение; и сделать, чтобы натуральные числа конвертировались в Т... тут будет, куча, что называется, gory details (и возможно подводных камней), про что и вопрос&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/decl/~4/8b3eobnpkpE" height="1" width="1"/&gt;</description>
		
		<category>decl</category>
		<pubDate>Wed, 14 Dec 2011 11:00:52 GMT</pubDate>
		
		
			<slash:comments>5</slash:comments>
		
	</item>
</channel>
</rss>

