<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" media="screen" href="/styles/xslt/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:c9="http://channel9.msdn.com">
<channel>
	<title>Comment Feed for Will48</title>
	<atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/Niners/Will48/Comments/RSS"></atom:link>
	<image>
		<url>http://mschnlnine.vo.llnwd.net/d1/Dev/App_Themes/C9/images/feedimage.png</url>
		<title>Will48</title>
		<link></link>
	</image>
	<description></description>
	<link></link>
	<language>en</language>
	<pubDate>Thu, 23 May 2013 06:52:21 GMT</pubDate>
	<lastBuildDate>Thu, 23 May 2013 06:52:21 GMT</lastBuildDate>
	<generator>Rev9</generator>
	<item>
		<title>Re: Erik Meijer - Functional Programming From First Principles</title>
		<description>
			<![CDATA[<p>I must say I'm really&nbsp;flabbergasted by this. The world of course is immutable.&nbsp;&nbsp;You can not change anything. If 5 minutes ago x was equal to 5, you can not change this fact, in the real world. But in imperative programming, you can. You just write x=15. Does this act of re-writing a register changes the fact that it had 5 stored in it just a flicker ago? Of course not. You just choose to forget about it. You don't care.</p><p>The real difference between mutable and immutable is the explication of time, which is part of the immutable mode of programming. Everything gets tagged with its time ultimately, and so there's no source for any confusion at all.The only reason imperative programs get confused is because they drop the time tags and hope for the actual execution in actual silicon to be somehow magically in-sync.</p><p>Of course that's silly.</p><p>I'm amazed why would anyone get intentionally confused by that simple example that Erik provides, of storing the value enumerated in a foreach loop, in a list. You just must understand first order principles first, like value vs reference, and understand the semantics of your language. What point is there to using a language if you don't understand its semantics????</p><p>What you're storing in a list there, is _reference_, not value. That is all there is to it. No mysteries there. And since you store a reference that will be looked up later, of course you must understand what scope it is from, and whether it gets reused or a new one is created each time.</p><p>This is really a beginner stuff for anyone proficient in Scheme or Lisp. It has been so, for the last 30-40 years, since the &quot;FUNARG problem&quot; was formulated, and solved.&nbsp;Oh, and &quot;func&quot; is pronounced &quot;thunk&quot; really.&nbsp;</p><p>It's just shocking to me, what I just heard in this talk. I'm half-way through by now. Shocking.&nbsp;</p><p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/posts/Erik-Meijer-Functional-Programming-From-First-Principles#c634895235620120445</link>
		<pubDate>Mon, 26 Nov 2012 10:46:02 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/posts/Erik-Meijer-Functional-Programming-From-First-Principles#c634895235620120445</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Dr. Ralf L&#228;mmel - Advanced Functional Programming - Evolution of an Interpreter</title>
		<description>
			<![CDATA[
<p>Yes, but what if we didn't have full Int to use at the intermediate level? My approach would still work, as in</p>
<p>&nbsp;</p>
<p><pre class="brush: text"> interpret Zero = Just 0 interpret (Succ x) = interpretPos 1 x interpret (Pred x) = interpretNeg 1 x interpretPos n Zero = Just n interpretPos n (Succ x) = interpretPos (n&#43;1) x interpretPos n (Pred x) = if n&gt;0 then interpretPos (n-1) x
 else interpretNeg 1 x interpretNeg n Zero = if n&gt;0 then Nothing else Just n interpretNeg n (Pred x) = interpretNeg (n&#43;1) x interpretNeg n (Succ x) = if n&gt;0 then interpretNeg (n-1) x else interpretPos 1 x</pre></p>
<p>&nbsp;</p>
<p>This way we don't demand the existence of extended domain prior to our defining it (we
<em>didn't</em> define negatives above, but we could, now - just using Either instead of Maybe).</p>
<p>&nbsp;</p>
<p>What I mean by my reference to monads is that I see it as essential to monads the separation of monad composition timeline and monad execution timeline, which makes optimization (pre-processing) while composing, possible - and that's what my version it doing.
 Also &quot;monadic&quot; is that my interpretPos/Neg pair encode and carry along the additional data. Or something like that. <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' /></p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Evolution-of-an-Interpreter#c634194636010000000</link>
		<pubDate>Tue, 07 Sep 2010 13:40:01 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Evolution-of-an-Interpreter#c634194636010000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Dr. Ralf L&#228;mmel - Advanced Functional Programming - Type Classes</title>
		<description>
			<![CDATA[
<p><em>... bringing some bits of </em>[LISP]<em> expressiveness to a </em>[statically]<em> typed setting.</em></p>
<p>&nbsp;</p>
<p>That about sums it up for the last two or three decades of mainstream language development. <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' />
</p>
<p>&nbsp;</p>
<p>Yes, of course (static) types are a huge difference comparing to run-time orientation of CLisp. One thing all comparers of CLOS and OO would always point out was the multi-dispatch capability of defmethod - and yet here you've shown how to achieve that,
 even at compile-time through the type resolution of Haskell! </p>
<p>&nbsp;</p>
<p>Finding such parallels really helps to clarify concepts, and to bring dicipline even into coding under permissive languages. After all, there's nothing that can't be expressed in a bit of ASM. <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' /> It's the
<em>insight</em> that we're really after in CS, I think.</p>
<p>&nbsp;</p>
<p>Thank you again for the great lectures!</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Type-Classes#c634194607270000000</link>
		<pubDate>Tue, 07 Sep 2010 12:52:07 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Type-Classes#c634194607270000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Dr. Ralf L&#228;mmel - Advanced Functional Programming - Type Classes</title>
		<description>
			<![CDATA[
<p>So is this, like, the Haskell encoding of CLisp's <em>defmethod</em>?</p>
<p>&nbsp;</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Type-Classes#c634194473680000000</link>
		<pubDate>Tue, 07 Sep 2010 09:09:28 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Type-Classes#c634194473680000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Dr. Ralf L&#228;mmel - Advanced Functional Programming - Evolution of an Interpreter</title>
		<description>
			<![CDATA[
<p>Thanks for clarifying the (Maybe Value) thing for me. <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' /> I really did have Meaning and Value conflated.</p>
<p>&nbsp;</p>
<p>Your &quot;views&quot; at the end of the post make total sense to me. About the code, I was thinking along the lines of</p>
<p>&nbsp;</p>
<p>&nbsp; interpret Zero = Just 0</p>
<p>&nbsp; interpret (Succ x) = interpret' 1 x</p>
<p>&nbsp; interpret (Pred x) = interpret' (-1) x</p>
<p>&nbsp; interpret' n (Succ x) = interpret' (n&#43;1) x</p>
<p>&nbsp; interpret' n (Pred x) = interpret' (n-1) x</p>
<p>&nbsp; interpret' n Zero = if n&gt;=0 then Just n else Nothing</p>
<p>&nbsp;</p>
<p>This really goes to the separation of <em>timelines </em>(<em>combination </em>
time vs <em>execution/run </em>time) as I see it as the essential feature of monads. To do something (here, (1&#43;) )
<em>after</em> the processing is done, or <em>while</em> processing - <em>after </em>
combining all the monadic actions, or <em>while </em>combining them. </p>
<p>&nbsp;</p>
<p>But it <em>is </em>an embellishement.</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Evolution-of-an-Interpreter#c634194437900000000</link>
		<pubDate>Tue, 07 Sep 2010 08:09:50 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Evolution-of-an-Interpreter#c634194437900000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Dr. Ralf L&#228;mmel - Advanced Functional Programming - Evolution of an Interpreter</title>
		<description>
			<![CDATA[
<p>Hi,</p>
<p>&nbsp;</p>
<p>while watching this new lecture, at 8:00 after adding Pred into the simple language interpreter, you say there's no change in its semantic domain. I'd expect there is a change, from type Value = Nat to type Value = Maybe Nat, and the definition for Nat staying
 the same, as type Nat = Int. Does this make sense? </p>
<p>&nbsp;</p>
<p>And, thanks a lot for the lectures! Very interesting stuff, and a clear presentation. Can't wait for the next ones, monads especially. Interpreters are of course the essence of Monads (?) (and vice versa <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' /> ). In that light, when you have { interpret (Succ
 x) = (Just.(&#43;1)) $$ interpret x }, it could've been redefined as an optimizing monad to push the (&#43;1) inside, hoping to catch the rogue Pred early on, making&nbsp; { interpret (Succ (Pred x))&nbsp; } always equivalent to { interpret (Pred (Succ x)) }, transforming it
 on the fly into just { interpret x }. Making { Succ(Pred Zero) } an invalid expression is too operational-minded IMO. I mean it in general, not here in this lecture of course where you have to keep things simple. And partial application would still be needed
 of course.</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Evolution-of-an-Interpreter#c634193819130000000</link>
		<pubDate>Mon, 06 Sep 2010 14:58:33 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Dr-Ralf-Lmmel-Advanced-Functional-Programming-Evolution-of-an-Interpreter#c634193819130000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Stephan T. Lavavej - Standard Template Library (STL), 2 of n</title>
		<description>
			<![CDATA[
<p>&gt; In this case, you're thinking about vector&lt;unique_ptr&lt;T&gt;&gt; or vector&lt;shared_ptr&lt;T&gt;&gt;.</p>
<p>&nbsp;</p>
<p>Thanks for the pointers! <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' /> </p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634169935120000000</link>
		<pubDate>Mon, 09 Aug 2010 23:31:52 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634169935120000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Stephan T. Lavavej - Standard Template Library (STL), 2 of n</title>
		<description>
			<![CDATA[
<p>yes, but in practice they do.&nbsp; But Stephan did clarify something to me (that should've been altogether clear anyway) - with indirection the objects indeed won't be stored contiguously. So adding/erasing elements at random positions would improve, but access
 would become slower. So I guess it depends, what a given vector is mainly used for. If its elements get shuffled a lot by a given algorithm, maybe my scheme would still be beneficient.
</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634158345300000000</link>
		<pubDate>Tue, 27 Jul 2010 13:35:30 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634158345300000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Stephan T. Lavavej - Standard Template Library (STL), 2 of n</title>
		<description>
			<![CDATA[
<p>yes memmove() is linear, but with incredibly smaller constant factor (to the point, I was hoping, of insignificance) than assign/copying objects one by one in the loop. My point was to use indirection always (with T** m_begin), thus enabling to call memmove()
 instead&nbsp;(i.e. T* is scalar just like int, and std::string* is scalar too). Then each erase() will take very small amount of time hopefully. I'm guessing&nbsp;but I think for vectors of lengths in low thousands it would make the &quot;dumb&quot; approach acceptably fast.
 Of course the smart algo with two iterators doing all the work in one pass&nbsp;is always better. Thanks for the explanations. <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif' alt='Smiley' />
</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634157845290000000</link>
		<pubDate>Mon, 26 Jul 2010 23:42:09 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634157845290000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Stephan T. Lavavej - Standard Template Library (STL), 2 of n</title>
		<description>
			<![CDATA[
<p>Here's how erase() is actually implemented in VS2008:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p></p>
<p><font size="2"></p>
<p>&nbsp;&nbsp;&nbsp; for (; _First != _Last; &#43;&#43;_Dest, &#43;&#43;_First)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *_Dest = *_First;</p>
<p>&nbsp;&nbsp;&nbsp; return (_Dest);</p>
<p>&nbsp;</p>
</font>&nbsp;
<p></p>
<p></p>
<p>So you see, here each element is copied, one by one - and this involves copy constructor in C&#43;&#43; which will actually create new object to be copied (the problem which move semantics came to address). This is obviously unimaginably worse than just calling
 memmove() once for each 100,000-long block of pointers or so (provided that the vector does actually store pointers to the actual objects somewhere on the heap) - even if pointers get copied one by one inside memmove(), still no temporary object creation/destruction
 is going on at all. That's exactly what move semantics does. And that's just what memmove() does, isn't it?</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634156962320000000</link>
		<pubDate>Sun, 25 Jul 2010 23:10:32 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634156962320000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Stephan T. Lavavej - Standard Template Library (STL), 2 of n</title>
		<description>
			<![CDATA[
<p>&quot;move them all back one notch [,] at once&quot;. I always thought of memmove() as an atomic operation (unless we move really big chunks of memory). Just like Stephan says, CPUs like to deal with contiguous blocks of memory, which fit in their caches - then moving
 one or a&nbsp;1000 takes the same time. Supposedly. The key here is we're not moving the 999 ptrs one&nbsp;by one - they all live in one contiguous block of memory, of size 4000 or 8000 bytes (32- or 64-bit ptrs), so we just need to move one memory block of size 999*4
 , 4 bytes down. The target and source regions overlap, but that's OK (I think).</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634156550200000000</link>
		<pubDate>Sun, 25 Jul 2010 11:43:40 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634156550200000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: VC 10: Stephan T. Lavavej and Damien Watkins - Inside STL</title>
		<description>
			<![CDATA[
<p>wow, it took C&#43;&#43; only 20 years to correct its most glaring deficiency, the excessive copying on assignment.</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/VC-10-Stephan-T-Lavavej-and-Damien-Watkins-Inside-STL#c634156525050000000</link>
		<pubDate>Sun, 25 Jul 2010 11:01:45 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/VC-10-Stephan-T-Lavavej-and-Damien-Watkins-Inside-STL#c634156525050000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: C9 Lectures: Stephan T. Lavavej - Standard Template Library (STL), 2 of n</title>
		<description>
			<![CDATA[
<p>Hi,</p>
<p>&nbsp;</p>
<p>why would vector need a linear time (38:10) to re-condense itself after erasure of an element? It is contiguous, and all it holds are pointers - why couldn't memmove() be used just to move them all back one notch at once, in constant time? Of course this
 is only for the case of non-inlined values, where you have an extra indirection level necessary for that, just like for the rvalue references. I guess in its quest for &quot;efficiency&quot; STL stores &quot;light&quot; values inside vector cells themselves, instead of boxing
 them up and storing just a pointer to the actual value on heap. Still, the implementation could distinguish between the two cases, right?</p>
<p>&nbsp;</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634156421020000000</link>
		<pubDate>Sun, 25 Jul 2010 08:08:22 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-2-of-n#c634156421020000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
	<item>
		<title>Re: Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx)</title>
		<description>
			<![CDATA[
<p>Just started watching this. About co/contravariance w.r.t. subtyping: producer types are covariant, and consumer types&nbsp;are contravariant to subtyping. Apple is a subtype of Fruit: wherever Fruit is used, Apple can be used too: A &lt;: F. That is because any
 quality Fruit has, Apple has too.</p>
<p>&nbsp;</p>
<p>Array read is a producer: give it an Int and it gives you an Apple. Now, A &lt;: F =&gt; (Int-&gt;A) &lt;: (Int-&gt;F). Wherever we use (Int-&gt;F), it gives us Fruits, so we must be prepared to handle Fruits there. But&nbsp;it's OK to use&nbsp;(Int-&gt;A) instead 'coz it'll give us Apples,
 which can go instead of Fruits always.</p>
<p>&nbsp;</p>
<p>With consumers it's the other way around. A&lt;:F =&gt; (F-&gt;Int) &lt;: (A-&gt;Int). Wherever we use&nbsp;Apples consumer, (A-&gt;Int), it is prepared to use Apples. So it means we must be supplying it with Apples. So we can use fruits consumer (F-&gt;Int) in its place, because
 this fruits consumer can always use Apples instead of Fruits.</p>
<p>&nbsp;</p>
<p>Graphically, we can envision the producers/consumers as pipes with a certain diameter - small for apples, bigger for fruits. There are many more fruits than there are apples - bananas too etc.&nbsp;Now, for a wide inlet of fruits consumer (us, in the 1st case),
 it can just as well handle all input from a narrower outlet of an apples producer. In the 2nd case, the narrow outlet of apples producer (us) can just as well go into a wider inlet of fruits consumer in general.</p>
<p>&nbsp;</p>
<p>Array read is a producer; array write is a consumer. Does&nbsp;this make sense?</p>
<p>&nbsp;</p>
<p>EDIT: and in general, covariant, when translated from Latin I gess, just means &quot;changing with the direction of change&quot;, and contravariant means &quot;changing in the opposite direction of change&quot;. Say we do something that enlarges one thing, and another one grows
 too, than it is covariant to the first w.r.t. our action. If it consistently shrinks, we say it's contravariant to the first w.r.t. our action.
</p>
<p>&nbsp;</p>
<p>For example, imagine you travel from city A to city B in one straight line. The further you go along the route, the further you are from the city A, so your distance from city A is covariant with the distance you travel in the car. But the distance to city
 B is contravariant&nbsp;to it - it grows smaller as you travel. I guess a &quot;travel operator&quot; in its covariant form will reflect the enlargement of the distance as measured from the origin point. But in its contravariant form it will show the shrinkage of distance
 as measured to the destination.</p>
<p>&nbsp;</p>
<p>Or take rotation: say we have a point on a plane, in some coordinate system. Now let's apply rotation to that plane. Point's coordinates will change WITH the plane's rotation, or covariantly. But what if we apply rotation to the coordinate system instead?
 Now the point's coordinates will change _in the opposite direction_ to the rotation, or contravariantly. That's where these terms come into physics from.
</p>
<p>posted by Will48</p>]]>
		</description>
		<link>http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx#c634147059490000000</link>
		<pubDate>Wed, 14 Jul 2010 12:05:49 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx#c634147059490000000</guid>
		<dc:creator>Will48</dc:creator>
	</item>
</channel>
</rss>