<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Apocalisp</title>
	<atom:link href="http://apocalisp.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://apocalisp.wordpress.com</link>
	<description>The end of programming as you know it</description>
	<lastBuildDate>Tue, 17 Jan 2012 02:36:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='apocalisp.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Apocalisp</title>
		<link>http://apocalisp.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://apocalisp.wordpress.com/osd.xml" title="Apocalisp" />
	<atom:link rel='hub' href='http://apocalisp.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Towards an Effect System in Scala, Part 2: IO Monad</title>
		<link>http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/</link>
		<comments>http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 16:22:04 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[mutable state]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=737</guid>
		<description><![CDATA[In the previous post, we looked at the ST monad and how we can use it to encapsulate in-place mutation as first-class referentially transparent expressions. ST gives us mutable references and arrays, with the following guarantees: Mutations of an object &#8230; <a href="http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=737&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/" target="_blank">previous post</a>, we looked at the <code>ST</code> monad and how we can use it to encapsulate in-place mutation as first-class referentially transparent expressions. <code>ST</code> gives us mutable references and arrays, with the following guarantees:</p>
<ol>
<li>Mutations of an object are guaranteed to run in sequence.</li>
<li>The holder of a mutable object is guaranteed to hold the only reference to it.</li>
<li>Once a sequence of mutations of an object terminates, that object is never mutated again.</li>
</ol>
<p>These invariants are enforced by the type system. I think that&#8217;s pretty cool, and sort of stands as a testament to the power of Scala&#8217;s type system.</p>
<p>This is much more than &#8220;delay side-effects until the last possible moment&#8221;. Remember, it is <em>always safe</em> to call <code>runST</code> on an <code>ST</code> action, anywhere in your program. As long as the call typechecks, it will have no observable side-effects with regard to STRefs and STArrays.</p>
<p>OK, so far we only have these guarantees for references and arrays, but that&#8217;s really not bad at all. We can eliminate an enormous class of bugs that have to do with shared mutable state, by guaranteeing that mutable state is never shared. Of course, you can still mutate other objects to your heart&#8217;s content (ones that are neither STRefs nor STArrays). But imagine for a second if Scala were modified in such a way that the <code>var</code> keyword actually constructed an <code>STRef</code>, and the only arrays provided by the library were of type <code>STArray</code>. Wouldn&#8217;t that be something? Wouldn&#8217;t that basically make Scala a purely functional language?</p>
<p>Well, no. There&#8217;s I/O. While ST gives us guarantees that mutable memory is never shared, it says nothing about reading/writing files, throwing exceptions, opening network sockets, database connections, etc.</p>
<h2></h2>
<h2>The IO Data Type</h2>
<p>We&#8217;re going to represent I/O actions as state transition functions, just like <code>ST</code> actions. Remember that <code>ST</code> is essentially a type like this:</p>
<p><pre class="brush: scala;">
type ST[S, A] = World[S] =&gt; (World[S], A)
</pre></p>
<p>The <code>IO</code> data type is very similar, except that we fix the world-state to be of a specific type:</p>
<p><pre class="brush: scala;">
type IO[A] = ST[RealWorld, A]
</pre></p>
<p><code>RealWorld</code> is totally abstract. It&#8217;s an uninhabited type (there are no values of type <code>RealWorld</code>). And we will understand a value of type <code>World[RealWorld]</code> to represent the current state of the entire universe. Sequencing is guaranteed, just like with <code>ST</code>, since the <code>IO</code> monad has to pass the world state in order to execute the next action.</p>
<p>In Scalaz, it&#8217;s not possible (without cheating) to create a value of type <code>World[RealWorld]</code>. There are no values of this type. So how do you run an <code>IO</code> action? Well, the <code>IO[A]</code> data type has the following method defined:</p>
<p><pre class="brush: scala;">
def unsafePerformIO: A = this(null)
</pre></p>
<p>This is actually cheating a little bit, because we&#8217;re faking the value of type <code>RealWorld</code> by passing nothing at all. We&#8217;re about to potentially destroy the universe anyway, so this is OK just once. Besides, there&#8217;s a reason why this method has &#8220;unsafe&#8221; in the name. You only want to ever call this method <em>once</em>. The idea is that you construct your entire program with as much a purely functional core as possible, and an outer shell written in the <code>IO</code> monad. Then at the &#8220;end of the universe&#8221;, you call <code>unsafePerformIO</code>:</p>
<p><pre class="brush: scala;">
import scalaz._; import Scalaz._; import scalaz.effects._

def main(args: Array[String]): Unit =
myProgram(ImmutableArray.fromArray(args)).unsafePerformIO

def myProgram(args: ImmutableArray[String]): IO[Unit] =
error(&quot;Your IO program goes here.&quot;)
</pre></p>
<p>Again, imagine if Scala were modified in such a way that instead of looking for <code>def main(args: Array[String]): Unit</code>, it would look for <code>def main(args: ImmutableArray[String]): IO[Unit]</code>.</p>
<h2>Benefits and Weaknesses of the IO Monad</h2>
<p>Because the <code>World</code> type argument is fixed in the definition of <code>IO</code>, we don&#8217;t have the same guarantees that we did with <code>ST</code>. Basically we can&#8217;t guarantee that the world state will never escape from <code>unsafePerformIO</code>. But we do have some other nice benefits.</p>
<p>For example, sequencing is still guaranteed, so no part of an action that depends on another will ever run before its dependency. This can be a problem if <code>IO[A]</code> is modeled as simply <code>() =&gt; A</code>. Also, <code>IO</code> actions are first-class objects, so they are freely composable and re-usable.</p>
<h2>
IO With the Scalaz Library</h2>
<p>Scalaz includes a bunch of <code>IO</code> combinators for manipulating standard input and output, throwing/catching errors, mutating variables, etc. For example, here are some combinators for standard I/O:`</p>
<p><pre class="brush: scala;">
def getChar: IO[Char]
def putChar(c: Char): IO[Unit]
def putStr(s: String): IO[Unit]
def putStrLn(s: String): IO[Unit]
def readLn: IO[String]
def putOut[A](a: A): IO[Unit]
</pre></p>
<p>Composing these into programs is done monadically. So we can use for-comprehensions. Here&#8217;s a program that reads a line of input and prints it out again:</p>
<p><pre class="brush: scala;">
def program: IO[Unit] = for {
line &lt;- readLn
_    &lt;- putStrLn(line)
} yield ()
</pre></p>
<p>Or equivalently:</p>
<p><pre class="brush: scala;">
def program: IO[Unit] = readLn flatMap putStrLn
</pre></p>
<p>And if we wanted to write another program that re-uses our existing program, we can. Here&#8217;s a program that runs out previous program forever:</p>
<p><pre class="brush: scala;">
def program2: IO[Unit] = program |+| program2
</pre></p>
<p><code>IO[Unit]</code> is an instance of <code>Monoid</code>, so we can re-use the monoid addition function <code>|+|</code>. Because everything is pure, we can concatenate programs just as easily as we concatenate Strings.</p>
<p>It&#8217;s also important to note that we&#8217;ve gained type safety. If you try to do this, you will get a type error:</p>
<p><pre class="brush: scala;">
scala&gt; (readLn flatMap putStrLn) |+| System.exit(0)
&lt;console&gt;:17: error: type mismatch;
found   : Unit
required: scalaz.effects.IO[Unit]
</pre></p>
<h2>
Conclusion</h2>
<p>We can gain a lot of static safety by separating values that produce I/O effects from values that have no effects, differentiating them via the type system. We also gain modularity by treating I/O actions as pure, compositional, first-class values that we can freely reuse in a completely deterministic way. Instead of running I/O effects everywhere in our code, we build programs through the <code>IO</code> DSL, compose them like ordinary values, and then run them with <code>unsafePerformIO</code> as part of our <code>main</code>.</p>
<p>&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/737/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/737/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/737/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/737/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/737/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/737/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/737/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/737/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=737&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Pascal&#8217;s Wager and the Problem of Computability</title>
		<link>http://apocalisp.wordpress.com/2011/11/18/pascals-wager-and-the-problem-of-computability/</link>
		<comments>http://apocalisp.wordpress.com/2011/11/18/pascals-wager-and-the-problem-of-computability/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 15:52:24 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=731</guid>
		<description><![CDATA[I was on a cable car yesterday morning and I was intellecually tickled by an advertisement posted on one of the walls in the car. It was an ad for a unitarian church, and in it they quoted Blaise Pascal: &#8230; <a href="http://apocalisp.wordpress.com/2011/11/18/pascals-wager-and-the-problem-of-computability/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=731&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was on a cable car yesterday morning and I was intellecually tickled by an advertisement posted on one of the walls in the car. It was an ad for a unitarian church, and in it they quoted Blaise Pascal:</p>
<blockquote><p>It is incomprehensible that God should exist, and it is incomprehensible that He should not exist.</p></blockquote>
<p>Pascal was a philosopher and mathematician, and he was trying to understand the question of whether or not one should believe in the existence of a God (specifically the Christian god, but that&#8217;s not important). He concluded that since the benefits of belief are supposedly enormous (or infinite), and one cannot actually know, one should wager in favor of there being a God, since then the benefit of being right is maximized and the cost of being wrong is minimized.</p>
<p>But Pascal made an error in his premises, which touches on computability theory. He sets out assuming that the statement &#8220;God exists&#8221; is either true or false. This is an unwarranted premise. Pascal was a rationalist, so he assumes the <em>dichotomy of truth</em>, that every statement is either true or false. But any programmer can tell you that this isn&#8217;t the case.</p>
<p>You see, Aristotle understood that not every statement is either true or false. The law of excluded middle says that a thing either <strong>is</strong> or <strong>is not</strong>. And truth or falsehood is an attribute only of statements that refer to things which <em>are</em>. For this reason, some statements are simply <em>absurd</em>, or <em>arbitrary</em>. Such statements cannot be examined for truth or falsehood. They can only be dismissed out of hand, as if nothing had been said. Because, in a very strict sense, nothing really has.</p>
<p>In computation, this is equivalent to the fact that not every program has an answer. Some programs simply bottom (crash or hang). There are types that are nonsensical and have no implementation except for programs whose answer is bottom. And there are questions that have no answer because they are nonsensical, and statements that are neither true nor false because they do not refer to any attributes or configurations of things which exist.</p>
<blockquote><p>But it is absurd and impossible to suppose that the unknowable and indeterminate <em>should contain and determine</em>.</p>
<p>- Aristotle</p></blockquote>
<blockquote><p>Not only is it not right, it&#8217;s <em>not even wrong</em>!</p>
<p>- Wolfgang Pauli</p></blockquote>
<blockquote><p>On two occasions I have been asked,—&#8221;Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?&#8221; &#8230; I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.</p>
<p>- Charles Babbage</p></blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/731/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/731/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/731/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/731/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/731/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/731/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/731/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/731/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=731&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/11/18/pascals-wager-and-the-problem-of-computability/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Tail Call Elimination in Scala Monads</title>
		<link>http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/</link>
		<comments>http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 22:00:02 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=714</guid>
		<description><![CDATA[Consider a simple reader monad: Now say we have a chain of flatMaps of arbitrary length. Let&#8217;s say 100,000. Let&#8217;s mock that up using a list: This is going to result in a single function that crashes with a StackOverflowError. &#8230; <a href="http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=714&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Consider a simple reader monad:</p>
<p><pre class="brush: scala;">
case class IntReader[A](run: Int =&gt; A) {
  def map[B](f: A =&gt; B): IntReader[B] =
    IntReader(i =&gt; f(run(i)))
  def flatMap[B](f: A =&gt; IntReader[B]): IntReader[B] =
    IntReader(i =&gt; f(run(i)).run(i))
}
</pre></p>
<p>Now say we have a chain of flatMaps of arbitrary length. Let&#8217;s say 100,000. Let&#8217;s mock that up using a list:</p>
<p><pre class="brush: scala;">
List.range(0, 100000).foldLeft(
  IntReader(List(_)))(
    (a, e) =&gt; a.flatMap(xs =&gt; IntReader(_ =&gt; e :: xs)))
</pre></p>
<p>This is going to result in a single function that crashes with a StackOverflowError. The reason why is that flatMap makes nested calls to <code>apply</code> on its argument without being in tail position. So the call stack repeatedly shows a call to <code>apply</code> in an anonymous function.</p>
<p><strong>CPS Transformation</strong></p>
<p>The classical way of avoiding the call stack in this situation is to transform the program to continuation-passing style (CPS). The CPS-transformed version of our reader monad looks like this:</p>
<p><pre class="brush: scala;">
trait IntReader[A] {
  def apply[R](k: A =&gt; R, i: Int): R
  def map[B](f: A =&gt; B): IntReader[B] = new IntReader[B] {
    def apply[R](k: B =&gt; R, i: Int): R = 
      IntReader.this(a =&gt; k(f(a)), i)
  }
  def flatMap[B](f: A =&gt; IntReader[B]): IntReader[B] = new IntReader[B] {
    def apply[R](k: B =&gt; R, i: Int): R =
      IntReader.this(a =&gt; k(f(a)(b =&gt; b, i)), i)
  }
}
</pre></p>
<p>Instead of returning <code>A</code> directly from <code>apply</code>, we take a continuation <code>k</code> that receives the <code>A</code>. You can see how this would be an improvement. The calls to <code>apply</code> are now all in tail position. And the calls to the continuation <code>k</code> at every point is also in tail position. Unfortunately, Scala has very limited tail call elimination, which is able to eliminate a tail call only if it&#8217;s a recursive call to the current method. But note that <code>apply</code> above actually calls a different <code>apply</code> method: that of the containing module. And since <code>k</code> is different from the <code>apply</code> method of the function it&#8217;s called from, the call to the continuation cannot be eliminated either. So if we traverse our list with this CPS-transformed reader monad, we will still get a StackOverflowError.</p>
<p><strong>Trampolining</strong></p>
<p>What we must do is exchange stack for heap. The idea is simple. Instead of making a tail call, we return a data structure representing what to do next.</p>
<p><pre class="brush: scala;">
sealed trait Trampoline[+A] {
  def run: A = this match {
    case Done(a) =&gt; a
    case More(t) =&gt; t().run
  }
}
case class Done[A](a: A) extends Trampoline[A]
case class More[A](a: () =&gt; Trampoline[A]) extends Trampoline[A]
</pre></p>
<p>Note that the <code>run</code> method is tail recursive. We can now use our trampoline to turn mutual recursion into tail recursion (thanks, Rich):</p>
<p><pre class="brush: plain;">
def even(n: Int): Trampoline[Boolean] = {
  if (n == 0) Done(true)
  else More(() =&gt; odd(n - 1))
}
def odd(n: Int): Trampoline[Boolean] = {
  if (n == 0) Done(false)
  else More(() =&gt; even(n - 1))
}
</pre></p>
<p>No matter how deep the mutual recursion, calling either of these methods simply returns a <code>Trampoline</code> that we can unwind tail-recursively with <code>run</code>:</p>
<p><pre class="brush: plain;">
scala&gt; val b = odd(100000001).run
b: Boolean = true
</pre></p>
<p><strong>Trampolines of Trampolines</strong></p>
<p>Now let&#8217;s say we wanted to transform a binary recursion in the same way. For example, the (terribly inefficient) recursive function to find the nth Fibonacci number:</p>
<p><pre class="brush: plain;">
def fib(n: Int): Int =
  if (n &lt; 2) n else fib(n - 1) + fib(n - 2)
</pre></p>
<p>There&#8217;s a bit of a problem here. If we change this to use our <code>Trampoline</code>, the result of <code>fib</code> will be <code>Trampoline[Int]</code>. So then how do we add two trampolines together? One way is to simply call <code>run</code>:</p>
<p><pre class="brush: plain;">
def fib(n: Int): Trampoline[Int] =
  if (n &lt; 2) Done(n) else More(() =&gt; fib(n - 1).run + fib(n - 2).run)
</pre></p>
<p>But this defeats the purpose! The call to <code>run</code> is not in a tail position here, and so we&#8217;re back to getting stack overflows.</p>
<p>Another idea is to make <code>Trampoline</code> a monad, by just adding a <code>flatMap</code> method to it. Then we can just say:</p>
<p><pre class="brush: plain;">
for { x &lt;- fib(n - 1)
      y &lt;- fib(n - 2) } yield x + y
</pre></p>
<p>But there is no way of implementing <code>flatMap</code> without calling <code>run</code>.</p>
<p><pre class="brush: plain;">
def flatMap[B](f: A =&gt; Trampoline[B]): Trampoline[B] =
  More(() =&gt; f(this.run).run)
</pre></p>
<p><strong>Delimited Continuations</strong></p>
<p>The solution, as ever so often with continuations, is found in delimited control. We bake monadicity into the <code>Trampoline</code> data type, with an additional case. Again, instead of making a call to the continuation, we return a data structure representing what we&#8217;re doing currently together with what to do with the result:</p>
<p><pre class="brush: scala;">
case class Cont[A, B](a: Trampoline[A],
                      f: A =&gt; Trampoline[B]) extends Trampoline[B]
</pre></p>
<p>Note that the arguments to this constructor are exactly the arguments to <code>flatMap</code>. The idea is that we can now implement <code>map</code> and <code>flatMap</code> like this:</p>
<p><pre class="brush: scala;">
def map[B](f: A =&gt; B): Trampoline[B] =
  Cont(this, a =&gt; More(() =&gt; Done(f(a))))
def flatMap[B](f: A =&gt; Trampoline[B]): Trampoline[B] =
  Cont(this, f)
</pre></p>
<p>The implementation of <code>run</code> becomes a tad more complicated now:</p>
<p><pre class="brush: scala;">
def run: A = {
  var cur: Trampoline[_] = this
  var stack: List[Any =&gt; Trampoline[A]] = List()
  var result: Option[A] = None
  while (result.isEmpty) {
    cur match {
      case Done(a) =&gt; stack match {
        case Nil =&gt; result = Some(a.asInstanceOf[A])
        case c :: cs =&gt; { 
          cur = c(a)
          stack = cs
        }
      }
      case More(t) =&gt; cur = t()
      case Cont(a, f) =&gt; {
        cur = a
        stack = f.asInstanceOf[Any =&gt; Trampoline[A]] :: stack 
      }
    }
  }
  result.get
}
</pre></p>
<p>We&#8217;re essentially breaking out of Scala here and dropping into a Java-level loop. Firstly, a <code>Cont</code> has two parts: an intermediate computation whose type is not known, and a continuation for which we only know the return type. Secondly, we have to keep our own stack of continuations as we descend into the monadic binds. So we must cast, just as if we were working in a language without generics. Don&#8217;t worry, the continuation type matches the intermediate computation by construction. Lastly, I&#8217;m using my own while loop instead of relying on Scala to translate tail recursion into a loop for me.</p>
<p>It&#8217;s possible to write this code with better types, using existentials and heterogeneous lists (left as an exercise for the hardened type-level programmer). But this is pretty self-contained, and we can be confident that it&#8217;s well typed without Scala&#8217;s help. It&#8217;s also possible to use the Delimited Continuations compiler plugin (also an exercise for the reader) to hide the casts, but that plugin makes these exact same casts.</p>
<p>Here is the whole trampoline code again:</p>
<p><pre class="brush: scala;">
  sealed trait Trampoline[A] {
    def map[B](f: A =&gt; B): Trampoline[B] =
      flatMap(a =&gt; More(() =&gt; Done(f(a))))
    def flatMap[B](f: A =&gt; Trampoline[B]): Trampoline[B] =
      Cont(this, f)
    def run: A = {
      var cur: Trampoline[_] = this
      var stack: List[Any =&gt; Trampoline[A]] = List()
      var result: Option[A] = None
      while (result.isEmpty) {
        cur match {
          case Done(a) =&gt; stack match {
            case Nil =&gt; result = Some(a.asInstanceOf[A])
            case c :: cs =&gt; { 
              cur = c(a)
              stack = cs
            }
          }
          case More(t) =&gt; cur = t()
          case Cont(a, f) =&gt; {
            cur = a
            stack = f.asInstanceOf[Any =&gt; Trampoline[A]] :: stack 
          }
        }
      }
      result.get
    }
  }
  case class Done[A](a: A) extends Trampoline[A]
  case class More[A](a: () =&gt; Trampoline[A]) extends Trampoline[A]
  case class Cont[A, B](a: Trampoline[A],
                        f: A =&gt; Trampoline[B]) extends Trampoline[B]
</pre></p>
<p>Now we can write binary-recursive Fibonacci function that uses constant stack:</p>
<p><pre class="brush: scala;">
def fib(n: Int): Trampoline[Int] =
  if (n &lt; 2) Done(n) else for {
    x &lt;- fib(n - 1)
    y &lt;- fib(n - 2)
  } yield (x + y)
</pre></p>
<p>Even with millions of recursive calls, we don&#8217;t overflow the stack:</p>
<p><pre class="brush: scala;">
scala&gt; fib(40).run
res23: Int = 102334155
</pre></p>
<p><strong>Trampolining other monads</strong></p>
<p>We&#8217;re now ready to come back to our original problem, which was tail call elimination in arbitrary monads. Remember that original reader monad?</p>
<p>As long as there exists a monad transformer version of the monad in question, we can transform our <code>Trampoline</code> monad, resulting in a new tail-recursive monad. For example, <code>type IntReader[A] = Int =&gt; A</code> is a monad, but <code>IntReaderT[M[_], A] = Int =&gt; M[A]</code> is also a monad, for any monad <code>M</code>, including <code>Trampoline</code>.</p>
<p>To illustrate this, I will use the <code>Kleisli</code> monad transformer from <strong>scalaz</strong>. Here, <code>Kleisli[M, A, B]</code> is isomorphic to the type <code>A =&gt; M[B]</code>, and so our trampolined <code>IntReader[A]</code> will be written <code>Kleisli[Trampoline, Int, A]</code>.</p>
<p>This lets us traverse, in our reader monad, a list with millions of elements:</p>
<p><pre class="brush: scala;">
val x = List.range(0, 1000000).
  foldLeft[Kleisli[Trampoline, Int, List[Int]]](
    kleisli(i =&gt; Done(List(i))))(
      (a, e) =&gt; kleisli(r =&gt; for {
        x &lt;- More(() =&gt; a.apply(r))
        y &lt;- Done(e + r :: x)
    } yield y))
</pre></p>
<p>And it&#8217;s all in constant stack:</p>
<p><pre class="brush: scala;">
scala&gt; x(0).run
res28: List[Int] = List(999999, 999998, 999997, 999996, 999995, ...
</pre></p>
<p>This can be employed with any monad transformer, e.g. <code>StateT</code>, <code>WriterT</code>, Iteratees, etc.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/714/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/714/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/714/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/714/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/714/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/714/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/714/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/714/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=714&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Monads are Dominoes</title>
		<link>http://apocalisp.wordpress.com/2011/07/01/monads-are-dominoes/</link>
		<comments>http://apocalisp.wordpress.com/2011/07/01/monads-are-dominoes/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 18:41:03 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Category Theory]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=694</guid>
		<description><![CDATA[It&#8217;s about time I made my contribution to the zoo of monad tutorials. After explaining the concept of monads to somebody who is not a programmer or a mathematician, I was told that what I had explained sounded exactly like &#8230; <a href="http://apocalisp.wordpress.com/2011/07/01/monads-are-dominoes/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=694&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s about time I made my contribution to the zoo of monad tutorials. After explaining the concept of monads to somebody who is not a programmer or a mathematician, I was told that what I had explained sounded exactly like a game of dominoes.</p>
<p>However, instead of explaining monads in terms of a cute metaphor about dominoes, I&#8217;m just going to throw you into the deep end. Deep breath!</p>
<p><em>Definition</em>: A category <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" alt="" />  is given by objects and arrows between these objects. Each arrow <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" />  has a unique source object <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" />  and a target object <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /> . For every three objects <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /> , <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /> , and <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /> , and arrows <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" />  and <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /> , there is a composite arrow <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /></p>
<p>such that</p>
<p><strong>Composition is associative</strong>: if <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /> , <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /> , and <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /> , then <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /></p>
<p><strong>There exists a unique identity arrow for each object</strong> For every object <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" /> , there exists an arrow <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/0078.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" />  such that for every arrow <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /> , we have <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/0062.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/0061.png" alt="" /></p>
<p><strong>A category for dominoes</strong>:</p>
<p>The objects of the category are the natural numbers. An arrow in the category is a domino piece with two numbers on it: <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/006E.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/006D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> . A composition of arrows <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" />  is two domino pieces placed together end-to-end by the following equation:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<p>The identity arrow for each object <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" />  is a domino piece <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" />  with the same number <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" alt="" />  on both ends.</p>
<p>Associativity:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<p>Identity:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<p><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0051.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0045.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" alt="" /></p>
<p>A monad for dominoes</p>
<p>Definition: A monad is given by a functor <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" alt="" />  (from a category <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" alt="" />  to itself, i.e. an endofunctor in <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" alt="" /> ), equipped with natural transformations:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/21D2.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /></div>
<div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" />x<img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/21D2.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /></div>
</div>
<p>where <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" alt="" />  is the identity functor and x is functor composition. This must satisfy the axioms that <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/03B7.png" alt="" />   and <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" />  are identity transformations, and <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" alt="" /> <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/03BC.png" alt="" />   (i.e. <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" />  is associative).</p>
<p>The dominoes need not be annotated with numbers, but might be annotated with any set of objects. Therefore, there exists an endofunctor <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" />  on the category of sets, such that for all sets <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /> , we can construct the set of dominoes <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> .</p>
<p>For every object <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0073.png" alt="" />  in <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /> , we can construct a domino <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0073.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0073.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> . This is <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" />  for our monad. Then, for the set of dominoes <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> , we can construct <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" />  which is the set of dominoes annotated with other dominoes. For any pair of dominoes in <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> , composed end-to-end, we can see it as a single domino in <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> . The <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" />  operation in our monad is then the fact that for any such pair of dominoes <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> , it behaves as the domino <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" />  with regard to composition with other dominoes in <img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /> .</p>
<p>Proof:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<p>Associativity:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0065.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0065.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0065.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<p>Identity:</p>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<div><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" alt="" /></div>
<p><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0051.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0045.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" alt="" /><img src="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" alt="" /></p>
<p>Exercises left to the reader:</p>
<p>1. What does a monoid in the category of dominoes look like?</p>
<p>2. How would the game of dominoes change if it allowed products and coproducts?</p>
<p>3. Can you come up with a coherent theory describing the behavior of &#8220;spinners&#8221; in the game of dominoes?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/694/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/694/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/694/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/694/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/694/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/694/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/694/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/694/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=694&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/07/01/monads-are-dominoes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/006E.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/006D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0078.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002B.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0051.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0045.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Caligraphic/Regular/120/0043.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/21D2.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/21D2.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0031.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2218.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0054.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/085/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0073.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0073.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0073.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003A.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/2192.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0053.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0065.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0063.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0065.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0066.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0067.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0064.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0065.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0068.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03B7.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/03BC.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/003D.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0028.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0061.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002C.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0062.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/0029.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0051.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0045.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Math/Italic/120/0044.png" medium="image" />

		<media:content url="http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/png/Main/Regular/120/002E.png" medium="image" />
	</item>
		<item>
		<title>Imperative vs Functional Programming</title>
		<link>http://apocalisp.wordpress.com/2011/05/30/imperative-vs-functional-programming/</link>
		<comments>http://apocalisp.wordpress.com/2011/05/30/imperative-vs-functional-programming/#comments</comments>
		<pubDate>Tue, 31 May 2011 02:27:29 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=678</guid>
		<description><![CDATA[Recently I had a quasi-private discussion about philosophy in programming where somebody asked a question about functional programming. I&#8217;d like to relay part of the discussion here since it might be of interest to the community at large. Jason wrote: &#8230; <a href="http://apocalisp.wordpress.com/2011/05/30/imperative-vs-functional-programming/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=678&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I had a quasi-private discussion about philosophy in programming where somebody asked a question about functional programming. I&#8217;d like to relay part of the discussion here since it might be of interest to the community at large.</p>
<p>Jason wrote:</p>
<blockquote><p>I have come out strongly in support of OO, and I think it has a very clear and strong basis in the facts of how computers work and how programmers think. In brief: Computers function by executing a series of instructions, at the level of machine language, which perform calculations and manipulate memory and I/O. In the earliest days of computing, programmers gave instructions to the computer directly at this level. As programs grew more complex, programmers needed ways to achieve greater unit-economy.</p>
<p>&#8230;</p>
<p>Often a set of variables truly do go together, such as a record representing an item for sale in a database, and certain functions operate primarily on this data. [This choice is not arbitrary.] Objects formalize this pattern and allow programmers to express it clearly and directly.</p>
<p>&#8230;</p>
<p>In general, imperative programming is rooted in the fact that computers actually run programs by executing a series of instructions.</p>
<p>&#8230;</p>
<p>I&#8217;d love to understand better the advantages of functional programming are. So to its advocates, I ask: What are the facts of reality that give rise to it? Note that it is not enough to explain, for instance, why it is mathematically *possible* to represent any given thing in any given mathematical way. What I want to know is: How is functional style rooted in the *purpose* of the software and the *nature of the thinking* that programmers do?
</p></blockquote>
<p><strong>On the validity of the FP approach</strong></p>
<p>The fact of reality that give rise to the FP approach is that computation is essentially a process of inferring quantities. Its purpose is to aid in human thinking. The conceptual faculty is a quantitative mechanism. This is laid out eloquently in <a href="http://www.amazon.com/Logical-Leap-Induction-Physics/dp/0451230051">David Harriman&#8217;s book &#8220;The Logical Leap&#8221;</a>. See also &#8220;Concept-formation as a mathematical process&#8221; in <a href="http://www.amazon.com/Objectivism-Philosophy-Ayn-Rand-Library/dp/0452011019/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1306808426&amp;sr=1-1">OPAR</a>. So the computer is in essence a quantifying device. Its invention was motivated by man&#8217;s need to quantify.</p>
<p>Calculating with numbers (quantities of something) gives rise to algebra, and importantly the abstraction &#8220;function&#8221;. And functional programming is simply writing programs using this abstraction. Functional programming was being done well before there were computers.</p>
<p>Imperatives are nonessential to computing. A mechanical computer has levers, wheels, and the like. We can imagine programming Babbage&#8217;s inference engine by turning a few wheels to set the premises and then moving a lever to make it infer the consequent. Similarly, in a digital computer we fill some registers with the premises and then pull a virtual lever in the form of a CPU instruction. But it&#8217;s important to note that &#8220;instruction&#8221; here is a metaphor. What&#8217;s really going on is the selection of a function which computes a quantity based on the input given.</p>
<p>So in summary, the purpose of the computer is to calculate with quantities as functions of other quantities. It is a mathematical tool. Even (especially?) for things like games. Drawing a complex 3D scene on the screen in real-time involves calculating a particular quantity of light of each color to be used to illuminate each pixel on the screen, given a particular time.</p>
<p><strong>On the utility of the FP approach</strong></p>
<p>Referential transparency buys you modularity (the extent to which components of a program can be separated and recombined) and compositionality (the extent to which the whole program can be understood by understanding the components and the rules used to combine them).</p>
<p>Type systems also get more sophisticated to the extent that programs are pure. It&#8217;s easier to infer types for pure programs than it is for impure ones, for example. You also gain things like type constructor polymorphism (a.k.a. higher-kinded types) and higher-rank types. It&#8217;s my experience that in a sufficiently sophisticated program (such as a compiler for a programming language), you either use these abstractions or you repeat yourself.</p>
<p>Sophisticated type systems then in turn aid in program inference, which is the extent to which the computer (or the programmer with the aid of the computer) can infer the correct program from type information (think tab completion, only moreso). Program inference is currently an active area of research.</p>
<p>As a side-note a lot of OO folks are discovering the functional approach as a tool to aid in modular design. They call it &#8220;dependency injection&#8221;, &#8220;inversion of control&#8221;, &#8220;interpreter pattern&#8221; and the like.</p>
<p><strong>On the way programmers think</strong></p>
<p>I believe that the way programmers think is deeply influenced by their chosen tools. They learn to think in the concepts that pertain to the tool. I think ultimately the argument that OO mirrors how programmers think is an appeal to intuition. But as we know, there&#8217;s no such thing as intuition. When people say &#8220;intuitive&#8221;, they usually just mean &#8220;familiar&#8221;.</p>
<p><strong>A word on OO and the arbitrary</strong></p>
<p>In OO, as commonly practiced, the choice of distinguished argument is arbitrary. Consider this function:</p>
<p><code>K(x, y) = x</code></p>
<p>If we were to write this in OO style, then on which object, x or y, should the function K be dispatched? Should it be x.K(y), or y.K(x)? It&#8217;s arbitrary. And before you say that the function K itself is an arbitrary invention, I say no. It&#8217;s actually a constructor of emtpy lists in this implementation of a singly linked list data structure:</p>
<p><code>Empty(x, y) = x<br />
Cons(a, b, x, y) = y(a, b(x, y))</code></p>
<p><strong>On &#8220;types of languages&#8221;</strong></p>
<p>I want to get clear on some concepts. First the question of &#8220;types of programming languages&#8221;. I don&#8217;t think it&#8217;s helpful to divide programming languages into &#8220;functional&#8221;, &#8220;object-oriented&#8221;, &#8220;imperative&#8221;, etc. Sure, certain languages are better suited to certain styles of programming, but it&#8217;s important to differentiate on essentials and not mere aesthetics.</p>
<p>Functional programming is a restriction that the programmer puts on his programs. Having a language with a compiler that will warn you if you&#8217;re breaking referential transparency is helpful, but not essential. I do functional programming in Java, for example, which most people consider an &#8220;imperative OO&#8221; language.</p>
<p>We can also do &#8220;OO&#8221; in Haskell, a purely functional language (in the sense that all Haskell programs are referentially transparent expressions). Haskell is also a very good imperative language. Here&#8217;s a Haskell program in imperative style:</p>
<pre>main = do {
  putStrLn "What is your name?";
  name &lt;- readLn;
  putStrLn (&quot;Hello, &quot; ++ name ++ &quot;!&quot;);
}</pre>
<p>Is this a sequence of instructions, or a referentially transparent expression? It&#8217;s both! Another way of writing the same program is:</p>
<p><code>main = putStrLn "What is your name?" &gt;&gt; readLn &gt;&gt;= (\name -&gt; putStrLn "Hello, " ++ name ++ "!")</code></p>
<p>It&#8217;s important to note that these are not two different programs in any sense. The Haskell compiler literally translates the former into the latter.</p>
<p>The <code>&gt;&gt;</code> and <code>&gt;&gt;=</code> functions concatenate IO actions in exactly the same sense that the <code>++</code> function concatenates Strings. It&#8217;s possible for us to do this because e.g. calling <code>readLn</code> doesn&#8217;t immediately read from standard input. It is a referentially transparent expression that returns an IO action. The operating environment translates this IO action into instructions for the underlying machine at some convenient time. Or it may in fact not do that. The implementation of the IO data structure is abstracted away in a library, and there&#8217;s no reason that somebody couldn&#8217;t supply a different implementation with the same interface. This may be useful if you&#8217;re programming a missile silo and you need to be able to test the <code>launchTheMissile</code> action without starting a nuclear war.</p>
<p>Another benefit is that <code>main</code> can be composed with other programs. We could, for example, write this program:</p>
<p><code>mainTwice = main &gt;&gt; main</code></p>
<p>Or this one:</p>
<p><code>mainForever = main &gt;&gt; mainForever</code></p>
<p>I hope that helps.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/678/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=678&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/05/30/imperative-vs-functional-programming/feed/</wfw:commentRss>
		<slash:comments>126</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Towards an Effect System in Scala, Part 1: ST Monad</title>
		<link>http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/</link>
		<comments>http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 05:02:53 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=655</guid>
		<description><![CDATA[Referentially Transparent Mutable State In their paper &#8220;Lazy Functional State Threads&#8221;, John Launchbury and Simon Peyton-Jones present a way of securely encapsulating stateful computations that manipulate mutable objects. The result is Haskell&#8217;s ST monad. Its definition is very similar to &#8230; <a href="http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=655&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Referentially Transparent Mutable State</strong></p>
<p>In their paper <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.144.2237&amp;rep=rep1&amp;type=pdf">&#8220;Lazy Functional State Threads&#8221;</a>, John Launchbury and Simon Peyton-Jones present a way of securely encapsulating stateful computations that manipulate mutable objects. The result is Haskell&#8217;s <code>ST</code> monad. Its definition is very similar to the <code>State</code> data type. In Haskell, the ST monad is used to thread the manipulation of <em>mutable</em> state in such a way that the mutation is completely referentially transparent, because it is a <em>type error</em> for a mutable object to escape the monad.</p>
<p>I would like to present an implementation of this in Scala, which I <a href="https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/ST.scala">recently committed</a> to the Scalaz library. I was inspired to write this by <a href="http://intoverflow.wordpress.com/2010/06/30/haskell-features-id-like-to-see-in-other-languages/">Tim Carstens</a> last summer, but never found a way of encoding the requisite rank-2 types in Scala&#8217;s type system in such a way that what should work does and what shouldn&#8217;t doesn&#8217;t. But <a href="http://existentialtype.net/2008/03/09/higher-rank-impredicative-polymorphism-in-scala/">Geoff Washburn</a> got me going again. Following the technique on his blog, of representing universal quantifiers as doubly negated existentials, I was able to encode ST in a way that&#8217;s surprisingly nice to use, and actually does give you type errors if you try to access a naked mutable reference. And as <a href="http://apocalisp.wordpress.com/2010/10/26/type-level-programming-in-scala-part-7-natural-transformation%C2%A0literals/">Mark Harrah</a> has pointed out, we end up not having to use the double negation after all. I&#8217;m surprised to find that doing this in the obvious way in Scala, just works.</p>
<p>OK, let&#8217;s get to the money. In Scala, we can declare the ST data type as follows:</p>
<p><pre class="brush: scala;">
case class World[A]()

case class ST[S, A](f: World[S] =&gt; (World[S], A)) {
  def apply(s: World[S]) = f(s)
  def flatMap[B](g: A =&gt; ST[S, B]): ST[S, B] =
    ST(s =&gt; f(s) match { case (ns, a) =&gt; g(a)(ns) })
  def map[B](g: A =&gt; B): ST[S, B] =
    ST(s =&gt; f(s) match { case (ns, a) =&gt; (ns, g(a)) })
}

def returnST[S, A](a: =&gt; A): ST[S, A] = ST(s =&gt; (s, a))
</pre></p>
<p>This is a monad in the obvious way. The <code>flatMap</code> method is monadic bind and <code>returnST</code> is monadic unit.</p>
<p>The <code>World</code> type represents some state of the world, and the ST type encapsulates a state transformer which receives the state of the world and returns a value which depends on that state together with a new state. Here, we are representing the world state by nothing at all. It turns out that for what we want to do with the ST monad, the contents of the state are not important, but its <em>type</em> very much is. A much more detailed explanation of how and why this works is given in the paper, but the punchline is that we are going to &#8220;transform the state&#8221; by mutating objects <em>in place</em>, and in spite of this the state transformer is going to be a <em>pure function</em>. This is achieved by guaranteeing that the type <code>S</code> for a given state transformer is unique. More on that in a second.</p>
<p><strong>Purely Functional Mutable References</strong></p>
<p>A simple object that we can mutate in place is one that holds a reference to another object through a mutable variable.</p>
<p><pre class="brush: scala;">
case class STRef[S, A](a: A) {
  private var value: A = a

  def read: ST[S, A] = returnST(value)
  def write(a: A): ST[S, STRef[S, A]] = ST((s: World[S]) =&gt; {value = a; (s, this)})
  def mod[B](f: A =&gt; A): ST[S, STRef[S, A]] = for {
    a &lt;- read
    v &lt;- write(f(a))
  } yield v
}

def newVar(a: =&gt; A) = returnST(STRef(a))
</pre></p>
<p>So we have monadic combinators to construct, read, write, and modify references. Note that the implementation of <code>write</code> blatantly mutates the object in place. The definition of <code>mod</code> shows how to compose state transformers in sequence, using monad comprehensions.</p>
<p>It&#8217;s important that an STRef is parameterized on a type <code>S</code> which represents the state thread that created it. This makes variables allocated by different state threads have incompatible types. Therefore, state threads cannot ever see each other&#8217;s mutable variables. Because state transformers can only be composed sequentially (with <code>flatMap</code>), it&#8217;s guaranteed that two of them can never simultaneously mutate the same STRef.</p>
<p><strong>Running a State Transformer as a Pure Function<br />
</strong><br />
Note that the type of a reference to a value of type <code>A</code> in a state thread <code>S</code> is <code>ST[S, STRef[S, A]]</code>. If ST had a <code>run</code> function of type <code>ST[S, A] =&gt; A</code>, we would be able to get the reference out. But this type is more general than we want. What we want is for the compiler to reject code like <code>newVar(10).run</code>, which would give you access to the naked STRef, but to accept code like <code>newVar(10).flatMap(_.mod(x =&gt; x + 1).flatMap(read)).run</code>, which simply accesses an integer.</p>
<p>In Haskell, the type of <code>runST</code> is:</p>
<p><code>runST :: forall a. (forall s. ST s a) -&gt; a</code>.</p>
<p>This is a <em>rank-2 type</em> which Scala&#8217;s type system does not directly support.</p>
<p>To see why this type would prevent the leaking of a mutable reference, consider the type you would need in order to get an STRef out of the ST monad.</p>
<p><code>forall a. (forall s. ST s (STRef s a)) -&gt; STRef ??? a</code></p>
<p>What type should go in place of the three question marks? There is no type that could possibly fit the bill because the type <code>s</code> is bound (introduced) by the universal quantifier to the left of the arrow. It&#8217;s a local type variable in the domain of the function, so it can&#8217;t escape to the codomain. This is why ST state transformers are referentially transparent.</p>
<p>Of course, if you get the value out of a reference, then you can run that just fine. In Scala terms, you can always go from <code>ST[S, A]</code> to <code>A</code>, but you can never go from <code>ST[S, F[S]]</code> to <code>F[S]</code> for any <code>F[_]</code>.</p>
<p><strong>Writing runST in Scala</strong></p>
<p>So the problem becomes how to represent a rank-2 polymorphic type in Scala. I&#8217;ve shown before <a href="http://apocalisp.wordpress.com/2010/07/02/higher-rank-polymorphism-in-scala/">how we can represent a rank-2 function type by encoding it as a natural transformation</a>. And <a href="http://apocalisp.wordpress.com/2010/10/26/type-level-programming-in-scala-part-7-natural-transformation%C2%A0literals/">Mark has posted</a> on how to write natural transformations using universally quantified values. (And I just now realized that he&#8217;s using functional state threads for non-observable mutation!)</p>
<p>First, we need a representation of universally quantified values:</p>
<p><pre class="brush: scala;">
trait Forall[P[_]] {
  def apply[A]: P[A]
}
</pre></p>
<p>Now that we have rank-2 polymorphism, the implementation of <code>runST</code> is straightforward:</p>
<p><pre class="brush: scala;">
  def runST[A](f: Forall[({type λ[S] = ST[S, A]})#λ]): A =
    f.apply.f(realWorld)._2
</pre></p>
<p>I&#8217;m using the &#8220;type lambda&#8221; trick here to declare the type constructor inline. The <code>realWorld</code> object is just a dummy value.</p>
<p><strong>Some Examples</strong></p>
<p>Here&#8217;s a simple example of a computation that creates a mutable reference and mutates it:</p>
<p><pre class="brush: scala;">
def e1[S]: ST[S, STRef[S, Int]] = for {
  r &lt;- newVar[S, Int](0)
  x &lt;- r.mod(_ + 1)
} yield x
</pre></p>
<p>And this expression creates a reference, mutates it, and then reads the value out:</p>
<p><pre class="brush: scala;">
def e2[A] = e1[A].flatMap(_.read)
</pre></p>
<p>Running the latter expression is fine, since it just returns an Int:</p>
<p><pre class="brush: scala;">
runST(new Forall[A] { def apply[A] = e2 })
</pre></p>
<p>But running the former fails at compile-time because it exposes a mutable reference. Or rather, because when the compiler tries to unify with our existential type, it&#8217;s out of scope:</p>
<p><pre class="brush: scala;">
runST(new Forall[({type λ[S] = ST[S, STRef[S, Int]]})#λ] { def apply[A] = e1 })

found   : scalaz.Forall[[S(in type λ)]scalaz.ST[S(in type λ),scalaz.STRef[S(in type λ),Int]]]
required: scalaz.Forall[[S(in type λ)]scalaz.ST[S(in type λ),scalaz.STRef[_ &gt;: (some other)S(in type λ) with (some other)S(in type λ), Int]]]
</pre></p>
<p>What are the practical implications of this kind of compile-time checking? I will just quote Peyton-Jones and Launchbury:</p>
<blockquote><p>It is possible to <em>encapsulate</em> stateful computations so that they appear to the rest of the program as pure (stateless) functions which are <em>guaranteed</em> by the type system to have no interactions whatever with other computations, whether stateful or otherwise (except via the values of arguments and results, of course).</p>
<p>Complete safety is maintained by this encapsulation. A program may contain an arbitrary number of stateful sub-computations, each simultaneously active, without concern that a mutable object from one might be mutated by another.</p></blockquote>
<p>This can be taken much further than these simple examples. In Scalaz, we have STArrays, which are purely functional mutable arrays. There&#8217;s an <a href="https://github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/example/ExampleST.scala">example of a pure binsort</a> which uses a mutable array for sorting.</p>
<p>This technique can be extrapolated to implement <a href="http://okmij.org/ftp/Haskell/regions.html">Monadic Regions</a> (currently underway for Scalaz), which allows compile-time tracking of not just mutable arrays and references, but file handles, database connections, and any other resource we care to track.</p>
<p>What we have here then is essentially the beginnings of an effect system for Scala. This allows us to compose programs from referentially transparent components which are internally implemented with mutation and effects, while those effects are guaranteed by the type system to be transparent to the rest of the program.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/655/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=655&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Simple SKI Combinator Calculus in Scala&#8217;s Type System</title>
		<link>http://apocalisp.wordpress.com/2011/01/13/simple-ski-combinator-calculus-in-scalas-type-system/</link>
		<comments>http://apocalisp.wordpress.com/2011/01/13/simple-ski-combinator-calculus-in-scalas-type-system/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 22:38:27 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=635</guid>
		<description><![CDATA[I would like to make two claims: The Scala type system is turing complete. This is not a bug. The SKI combinator calculus is known to be turing equivalent: And we can blow up the compiler with unbounded recursion, without &#8230; <a href="http://apocalisp.wordpress.com/2011/01/13/simple-ski-combinator-calculus-in-scalas-type-system/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=635&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I would like to make two claims:</p>
<ol>
<li>The Scala type system is turing complete.</li>
<li>This is not a bug.</li>
</ol>
<p>The SKI combinator calculus is known to be turing equivalent:</p>
<p><pre class="brush: scala;">
  trait λ { type ap[_&lt;:λ]&lt;:λ }
  type I = λ{type ap[X&lt;:λ] = X }
  type K = λ{type ap[X&lt;:λ] = λ{type ap[Y&lt;:λ] = X }}
  type S = λ{type ap[X&lt;:λ] = λ{type ap[Y&lt;:λ] = λ{type ap[Z&lt;:λ] = X#ap[Z]#ap[Y#ap[Z]] }}}
</pre></p>
<p>And we can blow up the compiler with unbounded recursion, without resorting to circular definitions:</p>
<p><pre class="brush: scala;">
type Y = S#ap[I]#ap[I]#ap[S#ap[I]#ap[I]]
</pre></p>
<p>The latter should crash the compiler with a stack overflow error.</p>
<p>Hat tip: <a href="http://comonad.com">Edward Kmett</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/635/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/635/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/635/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/635/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/635/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/635/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/635/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=635&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/01/13/simple-ski-combinator-calculus-in-scalas-type-system/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Functional Programming for Beginners</title>
		<link>http://apocalisp.wordpress.com/2011/01/10/functional-programming-for-beginners/</link>
		<comments>http://apocalisp.wordpress.com/2011/01/10/functional-programming-for-beginners/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 02:46:35 +0000</pubDate>
		<dc:creator>Rúnar</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=626</guid>
		<description><![CDATA[Video of a talk given at Boston Area Scala Enthusiasts&#8217; Jan 2011 meeting at Google Cambridge. Covers what FP actually means in unambiguous terms, and how to perform various programming tasks while staying pure. Slides are here: https://docs.google.com/leaf?id=0B6Pvyu_QqshwOTVjMDkxNTYtOTBhYy00NGQ4LWJhNTMtNzVlZmE1ODI1YTgx&#38;sort=name&#38;layout=list&#38;num=50 Code for &#8230; <a href="http://apocalisp.wordpress.com/2011/01/10/functional-programming-for-beginners/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=626&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Video of a talk given at Boston Area Scala Enthusiasts&#8217; Jan 2011 meeting at Google Cambridge. Covers what FP actually means in unambiguous terms, and how to perform various programming tasks while staying pure.</p>
<p><iframe src="http://player.vimeo.com/video/18554216" width="584" height="329" frameborder="0"></iframe></p>
<p>Slides are here:</p>
<p><a href="https://docs.google.com/leaf?id=0B6Pvyu_QqshwOTVjMDkxNTYtOTBhYy00NGQ4LWJhNTMtNzVlZmE1ODI1YTgx&amp;sort=name&amp;layout=list&amp;num=50">https://docs.google.com/leaf?id=0B6Pvyu_QqshwOTVjMDkxNTYtOTBhYy00NGQ4LWJhNTMtNzVlZmE1ODI1YTgx&amp;sort=name&amp;layout=list&amp;num=50<br />
</a></p>
<p>Code for the IO data structure mentioned but not shown at the end of the talk is given here:</p>
<p><pre class="brush: scala;">
  sealed trait IO[A] 
  case object ReadLn extends IO[String]
  case class WriteLn(s: String) extends IO[Unit]
  case class Const[A](a: A) extends IO[A]
  case class Compose[A, B](a: IO[A], f: A =&gt; IO[B]) extends IO[B]

  // An example program which reads a line and writes it out again
  def readThenWrite: IO[Unit] =
    Compose(ReadLn, WriteLn)

  // An implementation for IO programs which turns them into side-effects
  def run[A](program: IO[A]): A = program match {
    case ReadLn =&gt; readLine
    case WriteLn(s) =&gt; println(s)
    case Const(a) =&gt; a
    case Compose(a, f) =&gt; run(f(run(a)))
  }

  // An implementation for IO programs which turns them into list transitions
  def run[A](program: IO[A], in: List[String], out: List[String]): (A, List[String], List[String]) =
    program match {
      case ReadLn =&gt; (in.head, in.tail, out)
      case WriteLn(x)  =&gt; ((), in, x :: out)
      case Const(a) =&gt; (a, in, out)
      case Compose(ioa, f) =&gt; {
        val (a, tmpi, tmpo) = run(ioa, in, out)
        run(f(a), tmpi, tmpo)
      }
    }
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/626/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=626&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2011/01/10/functional-programming-for-beginners/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fe3ec04d1300b66c6afd32bf56979e54?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Rúnar</media:title>
		</media:content>
	</item>
		<item>
		<title>Type-Level Programming in Scala, Part 8c: KList ZipWith</title>
		<link>http://apocalisp.wordpress.com/2010/11/15/type-level-programming-in-scala-part-8c-klist%c2%a0zipwith/</link>
		<comments>http://apocalisp.wordpress.com/2010/11/15/type-level-programming-in-scala-part-8c-klist%c2%a0zipwith/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 23:30:10 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=616</guid>
		<description><![CDATA[One use of KList and the &#8216;transform&#8217; and &#8216;down&#8217; methods from 8b is to implement methods like &#8216;zipWith&#8217; for arbitrary tuple lengths. To start with, the signature of zipWith for a pair of Streams, operating on a fixed arity of &#8230; <a href="http://apocalisp.wordpress.com/2010/11/15/type-level-programming-in-scala-part-8c-klist%c2%a0zipwith/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=616&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One use of KList and the &#8216;transform&#8217; and &#8216;down&#8217; methods from 8b is to implement methods like &#8216;zipWith&#8217; for arbitrary tuple lengths.  To start with, the signature of zipWith for a pair of Streams, operating on a fixed arity of 2, looks like:<br />
<pre class="brush: scala;">
def zipWith2[A,B,C](t2: (Stream[A], Stream[B]))(f: (A,B) =&gt; C): Stream[C] =
   t2 match
   {
      case (ha #:: ta, hb #:: tb) =&gt; Stream.cons( f(ha, hb), zipWith2( (ta, tb) )(f) )
      case _ =&gt; Stream.empty
   }
</pre><br />
Example usage:<br />
<pre class="brush: scala;">
val nats = Stream.from(1)
val random = Stream.continually( math.random )
val seq = zipWith2( (nats, random) ) { (n, r) =&gt; if(r &gt; 0.3) n else -n }

scala&gt; seq.take(10).toList
res0: List[Int] = List(-1, 2, 3, 4, 5, 6, -7, -8, 9, 10)
</pre></p>
<p>For the implementation of zipWith2, if either Stream in the pair is empty, the resulting Stream is empty.  Otherwise, there is a head element for each stream in the pair.  We apply the provided function to these elements and make the result the head of a new Stream.  The tail of this new Stream will be the result of recursing on the tails of the input pair.</p>
<p>To generalize this to arbitrary arity, we will operate on a KList of Streams.  Because we want to abstract over arity, we use a heterogeneous list.  We use KList instead of HList because we want to constrain each element in the tuple to be a Stream and we don&#8217;t care what the specific types of Streams the elements are, but we do want to preserve those types.  When we take the head element of each Stream, the resulting list is the underlying HList type of the input KList.  For example, given an input of type <code>KList[Stream, A :: B :: HNil]</code>, when we take the head of each Stream in the KList we will get an HList of type <code>A :: B :: HNil</code>.  This is like going from <code>(Stream[A], Stream[B])</code> to <code>(A,B)</code>.</p>
<p>So, if we end up with the underlying HList type, the function we will apply to the input KList must be a function from that HList type to some other type.  In the example above, the function type would be <code>A :: B :: HNil =&gt; T</code> for some type T, which will be the type of the output Stream.  With this, we have our signature for a generalized zipWith:<br />
<pre class="brush: scala;">
def zipWith[HL &lt;: HList, T](kl: KList[Stream, HL])(f: HL =&gt; T): Stream[T]
</pre></p>
<p>To implement this function, we again break the problem into two parts.  If any Stream is empty, the resulting stream is empty.  Otherwise, we get all the head elements of the Streams as an HList, apply the input function to it, and make this the new head.  For the tail, we get all of the tails of the Streams and recurse.  To get the head elements, we use &#8216;down&#8217; because we want <code>KList[Stream, HL] =&gt; HL</code>.  For the tails, we use &#039;transform&#039; because we need a mapping <code>KList[Stream, HL] =&gt; KList[Stream, HL]</code>.  The implementation looks like:<br />
<pre class="brush: scala;">
def zipWith[HL &lt;: HList, T](kl: KList[Stream, HL])(f: HL =&gt; T): Stream[T] =
   if(anyEmpty(kl))
      Stream.empty
   else
      Stream.cons( f( kl down heads ), zipWith(kl transform tails )( f ) )

def anyEmpty(kl: KList[Stream, _]): Boolean = kl.toList.exists(_.isEmpty)

val heads = new (Stream ~&gt; Id) { def apply[T](s: Stream[T]): T = s.head }
val tails = new (Stream ~&gt; Stream) { def apply[T](s: Stream[T]): Stream[T] = s.tail }
</pre></p>
<p>The toList function on KList has type <code>KList[M, HL] =&gt; List[M[_]]</code> and has a trivial implementation.  Since List is homogeneous, we can&#8217;t preserve each individual cell&#8217;s type, but we can at least use the common type constructor.  In &#8216;zipWith&#8217;, this means we can call the &#8216;isEmpty&#8217; method on the elements of the list but we would not get a very specific type if we called &#8216;head&#8217;, for example.  &#8216;heads&#8217; and &#8216;tails&#8217; are natural transformations that map a Stream[T] to its head of type T and its tail of type Stream[T], respectively.</p>
<p>The original example translated to use the generalized zipWith looks like:<br />
<pre class="brush: scala;">
val nats = Stream.from(1)
val random = Stream.continually( math.random )
val seq = zipWith( nats :^: random :^: KNil ) {
   case n :: r :: HNil =&gt; if(r &gt; 0.3) n else -n
}

scala&gt; seq.take(10).toList
res0: List[Int] = List(-1, 2, -3, -4, -5, 6, 7, 8, 9, 10)
</pre></p>
<p>We can implement the related &#8216;zipped&#8217; function in terms of &#8216;zipWith&#8217;.<br />
<pre class="brush: scala;">
def zipped[HL &lt;: HList](kl: KList[Stream, HL]): Stream[HL] =
   zipWith(kl)(x =&gt; x)
</pre></p>
<p>Or, we could have implemented zipWith in terms of zipped.  In any case, we can implement several other functions using zipped:<br />
<pre class="brush: scala;">
def foreach[HL &lt;: HList, T](kl: KList[Stream, HL])(f: HL =&gt; T): Unit =
   zipped(kl).foreach(f)

def collect[HL &lt;: HList, T](kl: KList[Stream, HL])(f: HL =&gt; Option[T]): Stream[T] =
   zipped(kl).collect(f)

def flatMap[HL &lt;: HList, T](kl: KList[Stream, HL])(f: HL =&gt; Stream[T]): Stream[T] =
   zipped(kl).flatMap(f)

def forall[HL &lt;: HList](kl: KList[Stream, HL])(f: HL =&gt; Boolean): Boolean =
   zippped(kl).forall(f)
      
def exists[HL &lt;: HList](kl: KList[Stream, HL])(f: HL =&gt; Boolean): Boolean =
   zipped(kl).exists(f)
</pre></p>
<p>An example using &#8216;foreach&#8217;:<br />
<pre class="brush: scala;">
val a = Stream(1,2,5,3,9,10,101)
val b = Stream(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;)
val c = Stream(true, false, false, true, true)

zipped(a :^: b :^: c :^: KNil) foreach {
   case n :: s :: b :: HNil =&gt;
      println( s * (if(b) 1 else n) )
}

one
twotwo
threethreethreethreethree
four
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/616/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/616/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/616/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/616/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/616/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/616/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/616/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/616/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=616&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2010/11/15/type-level-programming-in-scala-part-8c-klist%c2%a0zipwith/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e8de1be98d66ac0eb22fd7473aa263?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">dmharrah</media:title>
		</media:content>
	</item>
		<item>
		<title>Type-Level Programming in Scala, Part 8b: KList basics</title>
		<link>http://apocalisp.wordpress.com/2010/11/03/type-level-programming-in-scala-part-8b-klist%c2%a0basics/</link>
		<comments>http://apocalisp.wordpress.com/2010/11/03/type-level-programming-in-scala-part-8b-klist%c2%a0basics/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 23:55:28 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://apocalisp.wordpress.com/?p=505</guid>
		<description><![CDATA[In the absence of rank-2 types, it can be useful to have a higher-kinded heterogeneous list, which I&#8217;ll call KList here. A KList defines a type constructor M[_] that is used to construct the type for all cells in the &#8230; <a href="http://apocalisp.wordpress.com/2010/11/03/type-level-programming-in-scala-part-8b-klist%c2%a0basics/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=505&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In the absence of rank-2 types, it can be useful to have a higher-kinded heterogeneous list, which I&#8217;ll call KList here.  A KList defines a type constructor M[_] that is used to construct the type for all cells in the list.  The parameter passed to this type constructor can be different for each cell, which is the heterogeneous part.  One use of a KList is to define a generic zipWith function.  KLists are also used in the implementation of the new task engine in sbt 0.9.  Each of these applications will be described in subsequent posts.</p>
<p>We&#8217;ll start with the basic definition of KList, which looks like:<br />
<pre class="brush: scala;">
sealed trait KList[+M[_], HL &lt;: HList]

final case class KCons[H, T &lt;: HList, +M[_]](head: M[H], tail: KList[M,T]) extends KList[M, H :+: T] {
  // prepend
  def :^: [N[X] &gt;: M[X], G](g: N[G]) = KCons(g, this)
}

sealed class KNil extends KList[Nothing, HNil] {
  def :^: [M[_], H](h: M[H]) = KCons(h, this)
}

object KNil extends KNil

object KList {
  // nicer alias for pattern matching
  val :^: = KCons
}
</pre></p>
<p>It looks similar to HList with the exception of the type constructor M.  We keep the type of &#8216;head&#8217; in KCons in two pieces: the type constructor M common to all cells in the KList and the type parameter to M that is specific to this cell.  The full type of &#8216;head&#8217; is then M[H].</p>
<p>An example construction:<br />
<pre class="brush: scala;">
  val m = List(1, 2, 3, 4) :^: List(&quot;str1&quot;, &quot;str2&quot;) :^: KNil
</pre><br />
This has type:<br />
<pre class="brush: scala;">
KCons[Int,java.lang.String :: HNil,List]
</pre><br />
Note that we can mix type constructors that are compatible:<br />
<pre class="brush: scala;">
  val m = Seq(1, 2, 3, 4) :^: List(&quot;str1&quot;, &quot;str2&quot;) :^: KNil
  m: KCons[Int,java.lang.String :: HNil,Seq]
</pre><br />
Ones that are not compatible crash the compiler:<br />
<pre class="brush: scala;">
val m = Seq(1, 2, 3, 4) :^: Option(&quot;str1&quot;, &quot;str2&quot;) :^: KNil
scala.tools.nsc.symtab.Types$NoCommonType: lub/glb of incompatible types: [X]Option[X] and Seq
</pre></p>
<p>It is not possible to have types inferred in several cases, such as when the type constructor is Id, where type Id[X] = X :<br />
<pre class="brush: scala;">
  // does not compile
  val p = 1 :^: true :^: KNil
</pre></p>
<p>A key use of a KList is to apply a natural transformation to its contents.  We have kept the type constructor separate from the type parameters, which means we can apply a natural transformation M ~&gt; N to each element and preserve the underlying type parameters.  As an example, consider our heterogeneous list of Lists:<br />
<pre class="brush: scala;">
  val m = List(1, 2, 3, 4) :^: List(&quot;str1&quot;, &quot;str2&quot;) :^: KNil
</pre><br />
and a natural transformation that takes a List and calls headOption on it:<br />
<pre class="brush: scala;">
val headOption = new (List ~&gt; Option) {
  def apply[T](list: List[T]): Option[T] =
    list.headOption
}
</pre><br />
Then, apply headOption to m:<br />
<pre class="brush: scala;">
val heads = m transform headOption
heads: KCons[Int,(java.lang.String :: HNil),Option] = KCons(Some(1),KCons(Some(str1),KNil))
</pre><br />
We get a KList of Options, preserving the knowledge that the first element has type Option[Int] and the second has type Option[String].</p>
<p>The &#8216;transform&#8217; method on KList is straightforward to implement:<br />
<pre class="brush: scala;">
sealed trait KList[+M[_], HL &lt;: HList] {
  ...
  def transform[N[_]](f: M ~&gt; N): KList[N, HL]
}

final case class KCons[H, T &lt;: HList, +M[_]](head: M[H], tail: KList[M,T]) extends KList[M, H :+: T] {
  ...  
  def transform[N[_]](f: M ~&gt; N) = KCons( f(head), tail transform f )
}

sealed class KNil extends KList[Nothing, HNil] {
  ...
  def transform[N[_]](f: Nothing ~&gt; N) = KNil
}
</pre></p>
<p>We can add another method that down-converts a KList to its underlying HList.  For example, we might reduce each List in our KList above to its head element:<br />
<pre class="brush: scala;">
val head = new (List ~&gt; Id) {
  def apply[T](list: List[T]): T =
    list.head
}

val heads = m down head
heads: Int :: java.lang.String :: HNil = 1 :: str1 :: HNil
</pre></p>
<p>The definition of &#8216;down&#8217; looks like:<br />
<pre class="brush: scala;">
sealed trait KList[+M[_], HL &lt;: HList] {
  ...
  // For converting KList to an HList
  def down(f: M ~&gt; Id): HL
}

final case class KCons[H, T &lt;: HList, +M[_]](head: M[H], tail: KList[M,T]) extends KList[M, H :+: T] {
  ...
  def down(f: M ~&gt; Id) = HCons(f(head), tail down f)
}

sealed class KNil extends KList[Nothing, HNil] {
  ...
  def down(f: Nothing ~&gt; Id) = HNil
}
</pre></p>
<p>We will use &#8216;down&#8217; and &#8216;transform&#8217; in the next section to implement zipWith for arbitrary arity.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apocalisp.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apocalisp.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apocalisp.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apocalisp.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apocalisp.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apocalisp.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apocalisp.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apocalisp.wordpress.com/505/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apocalisp.wordpress.com&amp;blog=1150675&amp;post=505&amp;subd=apocalisp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apocalisp.wordpress.com/2010/11/03/type-level-programming-in-scala-part-8b-klist%c2%a0basics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e8de1be98d66ac0eb22fd7473aa263?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">dmharrah</media:title>
		</media:content>
	</item>
	</channel>
</rss>
