<snapdata remixID="8172408"><project name="Monads" app="Snap! 5.0, http://snap.berkeley.edu" version="1"><notes>Watch https://www.youtube.com/watch?v=t1e8gqXLbsU to find out more about monads.&#xD;&#xD;Monads are these interesting things which allow you to change how functions are composed or chained together. For example, the "List" monad, instead of passing one value to the next part of the computation, will call it several times with each value in the given list, and append the lists that get reported back together.</notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" lines="round" ternary="false" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Maybe" idx="1" x="-32" y="-7" heading="90" scale="1" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><comment x="20" y="10" w="536" collapsed="false">The &quot;Maybe&quot; monad allows you to create functions that take and return &quot;Maybe&quot; values, and will fail quietly if it receives an undefined or error value &quot;Nothing&quot;. This isn&apos;t that useful in Snap!, but it made it easier to test the monad system.</comment><script x="20" y="76"><block s="doSetVar"><l>maybe</l><block s="reportNewList"><list><block s="reifyReporter"><autolambda><custom-block s="if %b then %anyUE else %anyUE"><custom-block s="%s = just %upvar"><block var="value"/><l>x</l></custom-block><block s="evaluate"><block var="comp"/><list><block var="x"/></list></block><custom-block s="nothing"></custom-block></custom-block></autolambda><list><l>value</l><l>comp</l></list></block><block s="reifyReporter"><autolambda><custom-block s="just %s"><l></l></custom-block></autolambda><list></list></block></list></block></block></script><script x="20" y="211"><block s="evaluate"><block s="reifyReporter"><autolambda><custom-block s="%l %s &gt;&gt;= %repRing"><block var="maybe"/><block var="mx"/><block s="reifyReporter"><autolambda><custom-block s="%l %s &gt;&gt;= %repRing"><block var="maybe"/><block var="my"/><block s="reifyReporter"><autolambda><custom-block s="if %b then %anyUE else %anyUE"><block s="reportGreaterThan"><block var="x"/><l>3</l></block><custom-block s="%l return %s"><block var="maybe"/><block s="reportQuotient"><block var="x"/><block var="y"/></block></custom-block><custom-block s="%l return %s"><block var="maybe"/><block s="reportProduct"><block var="x"/><block var="y"/></block></custom-block></custom-block></autolambda><list><l>y</l></list></block></custom-block></autolambda><list><l>x</l></list></block></custom-block></autolambda><list><l>mx</l><l>my</l></list></block><list><custom-block s="just %s"><l>2</l></custom-block><custom-block s="just %s"><l>2</l></custom-block></list></block></script><script x="20" y="411"><block s="evaluate"><block s="reifyReporter"><autolambda><custom-block s="using monad %l do %cs"><block var="maybe"/><script><custom-block s="%s %upvar &lt;- %anyUE"><l></l><l>x</l><block var="mx"/></custom-block><custom-block s="%s %upvar &lt;- %anyUE"><l></l><l>y</l><block var="my"/></custom-block><custom-block s="%s if %boolUE then %cs else %cs"><l></l><block s="reportGreaterThan"><block var="x"/><l>3</l></block><script><custom-block s="%s return %anyUE"><l></l><block s="reportQuotient"><block var="x"/><block var="y"/></block></custom-block></script><script><custom-block s="%s return %anyUE"><l></l><block s="reportProduct"><block var="x"/><block var="y"/></block></custom-block></script></custom-block></script></custom-block></autolambda><list><l>mx</l><l>my</l></list></block><list><custom-block s="just %s"><l>2</l></custom-block><custom-block s="just %s"><l>2</l></custom-block></list><comment w="186" collapsed="false">This syntactic sugar isn&apos;t perfect because it doesn&apos;t allow for any expression other than &quot;bind&quot; or &quot;return&quot; as the computation, but you can still handle that in the values you return from &quot;bind&quot; and the parameter names.&#xD;&#xD;I&apos;ve added &quot;if .. then .. else&quot; as well, for further ease of use. These are fundamentally equivalent to the reporter &quot;if&quot;, and not the command &quot;if&quot;, because what you&apos;re seeing here is something that gets turned into the nested blocks just above.</comment></block></script></scripts></sprite><sprite name="State" idx="2" x="68" y="-7" heading="90" scale="1" rotation="1" draggable="true" costume="0" color="0,36.720000000000034,229.5,1" pen="tip" id="156"><costumes><list struct="atomic" id="157"></list></costumes><sounds><list struct="atomic" id="158"></list></sounds><blocks></blocks><variables></variables><scripts><comment x="20" y="10" w="528" collapsed="false">The &quot;State&quot; monad is used to implement mutable state in purely functional programming languages. Because Snap! is a multiparadigm language with mutable state to begin with, though, it&apos;s not very useful. This did help in testing interesting monads with implementations I wouldn&apos;t have thought of. A monad where wrapped values are functions that take the current state was really interesting to discover.</comment><script x="20" y="100"><block s="doSetVar"><l>state</l><block s="reportNewList"><list><block s="reifyReporter"><autolambda><block s="reifyReporter"><autolambda><custom-block s="let %upvar = %s in %anyUE"><l>x and new state</l><block s="evaluate"><block var="value"/><list><block var="current state"/></list></block><block s="evaluate"><block s="evaluate"><block var="comp"/><list><block s="reportListItem"><l>1</l><block var="x and new state"/></block></list></block><list><block s="reportListItem"><l>2</l><block var="x and new state"/></block></list></block></custom-block></autolambda><list><l>current state</l></list></block></autolambda><list><l>value</l><l>comp</l></list></block><block s="reifyReporter"><autolambda><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block var="x"/><block var="state"/></list></block></autolambda><list><l>state</l></list></block></autolambda><list><l>x</l></list></block></list></block></block></script><script x="20" y="316"><block s="evaluate"><custom-block s="%l %s &gt;&gt;= %repRing"><block var="state"/><custom-block s="set state to %s"><l>2</l></custom-block><block s="reifyReporter"><autolambda><custom-block s="%l %s &gt;&gt;= %repRing"><block var="state"/><custom-block s="get state"></custom-block><block s="reifyReporter"><autolambda><custom-block s="%l %s &gt;&gt;= %repRing"><block var="state"/><custom-block s="modify state with %repRing"><block s="reifyReporter"><autolambda><block s="reportSum"><l></l><l>1</l></block></autolambda><list></list></block></custom-block><block s="reifyReporter"><autolambda><custom-block s="%l return %s"><block var="state"/><block s="reportProduct"><block var="s"/><l>2</l></block></custom-block></autolambda><list></list></block></custom-block></autolambda><list><l>s</l></list></block></custom-block></autolambda><list></list></block></custom-block><list><l>3</l></list></block></script><script x="20" y="485"><block s="evaluate"><custom-block s="using monad %l do %cs"><block var="state"/><script><custom-block s="%s %anyUE &gt;&gt;"><l></l><custom-block s="set state to %s"><l>2</l></custom-block></custom-block><custom-block s="%s %upvar &lt;- %anyUE"><l></l><l>s</l><custom-block s="get state"></custom-block></custom-block><custom-block s="%s %anyUE &gt;&gt;"><l></l><custom-block s="modify state with %repRing"><block s="reifyReporter"><autolambda><block s="reportSum"><l></l><l>1</l></block></autolambda><list></list></block></custom-block></custom-block><custom-block s="%s return %anyUE"><l></l><block s="reportProduct"><block var="s"/><l>2</l></block></custom-block></script></custom-block><list><l>3</l></list></block></script></scripts></sprite><sprite name="List" idx="3" x="12" y="-58" heading="90" scale="1" rotation="1" draggable="true" costume="0" color="145,26,68,1" pen="tip" id="315"><costumes><list struct="atomic" id="316"></list></costumes><sounds><list struct="atomic" id="317"></list></sounds><blocks></blocks><variables></variables><scripts><comment x="20" y="20" w="498" collapsed="false">The &quot;List&quot; monad. I can perform all sorts of actions on list items with it. Mapping a list item to several list items, or to zero list items, for example, or performing multiple layers of mapping.</comment><script x="20" y="98"><block s="doSetVar"><l>list</l><block s="reportNewList"><list><block s="reifyReporter"><autolambda><custom-block s="append %mult%l"><custom-block s="%upvar map %repRing over %mult%l"><l>#</l><block var="comp"/><list><block var="value"/></list></custom-block></custom-block></autolambda><list><l>value</l><l>comp</l></list></block><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block var="x"/></list></block></autolambda><list><l>x</l></list></block></list></block></block></script><script x="20" y="204"><custom-block s="%l %s &gt;&gt;= %repRing"><block var="list"/><block s="reportNewList"><list><l>2</l><l>3</l><l>5</l><l>8</l></list></block><block s="reifyReporter"><autolambda><custom-block s="%l %s &gt;&gt;= %repRing"><block var="list"/><block s="reportNewList"><list><block s="reportDifference"><block var="x"/><l>2</l></block><block s="reportSum"><block var="x"/><l>2</l></block></list></block><block s="reifyReporter"><autolambda><custom-block s="%l return %s"><block var="list"/><block s="reportProduct"><block var="y"/><l>2</l></block></custom-block></autolambda><list><l>y</l></list></block></custom-block></autolambda><list><l>x</l></list></block></custom-block></script><script x="20" y="303"><custom-block s="using monad %l do %cs"><block var="list"/><script><custom-block s="%s %upvar &lt;- %anyUE"><l></l><l>x</l><block s="reportNewList"><list><l>2</l><l>3</l><l>5</l><l>8</l></list></block><comment w="310" collapsed="false">What&apos;s really interesting here is that there is no variable &quot;x&quot; that gets set to a list. Instead, the &quot;&lt;-&quot; syntax means that we want to send the value (&quot;list&quot;) along with the rest of the computation to the monad&apos;s &quot;bind&quot; function, which maps the rest of the computation over the list of values.In other words, by doing &quot;x &lt;- list ...&quot;, what we&apos;re actually specifying, in the case of the List monad, is &quot;map the next part of this computation over all items in list ... using the variable x&quot;!</comment></custom-block><custom-block s="%s %upvar &lt;- %anyUE"><l></l><l>y</l><block s="reportNewList"><list><block s="reportDifference"><block var="x"/><l>2</l></block><block s="reportSum"><block var="x"/><l>2</l></block></list></block></custom-block><custom-block s="%s return %anyUE"><l></l><block s="reportProduct"><block var="y"/><l>2</l></block></custom-block></script></custom-block></script></scripts></sprite><watcher var="maybe" style="normal" x="13" y="10.00000399999999" color="243,118,29" extX="80" extY="70"/><watcher var="state" style="normal" x="12" y="105" color="243,118,29" extX="80" extY="70"/><watcher var="list" style="normal" x="120" y="11" color="243,118,29" extX="80" extY="70"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="%&apos;monad&apos; %&apos;value&apos; &gt;&gt;= %&apos;comp&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s"></input><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="monad"/></block><list><block var="value"/><block var="comp"/></list></block></block></script></block-definition><block-definition s="%&apos;monad&apos; return %&apos;value&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportListItem"><l>2</l><block var="monad"/></block><list><block var="value"/></list></block></block></script></block-definition><block-definition s="id" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block var="#1"/></autolambda><list><l>#1</l></list></block></block></script></block-definition><block-definition s="append %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="287" collapsed="false">Take any number of input lists, and create a new list containing the items of the input lists.  So              APPEND [A B] [C D]where the [,,,] are lists reports the list              [A B C D]not [[A B] [C D]].</comment><header></header><code></code><translations></translations><inputs><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block var="lists"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListLength"><block var="lists"/></block><l>1</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="lists"/></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="lists"/></block><block s="reportNewList"><list></list></block></block><script><block s="doReport"><custom-block s="append %mult%l"><block s="reportCDR"><block var="lists"/></block></custom-block></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="lists"/></block></block><custom-block s="append %mult%l"><block s="reportCONS"><block s="reportCDR"><block s="reportListItem"><l>1</l><block var="lists"/></block></block><block s="reportCDR"><block var="lists"/></block></block></custom-block></block></block></script></block></script></block-definition><block-definition s="reverse %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="223" collapsed="false">Reports a new list containing the items of the input list, but in the opposite order.</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>helper</l></list></block><block s="doSetVar"><l>helper</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><block var="input"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="result"/></block></script></block><block s="doReport"><block s="evaluate"><block var="helper"/><list><block s="reportCDR"><block var="input"/></block><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="input"/></block><block var="result"/></block></list></block></block></script><list><l>input</l><l>result</l></list></block></block><block s="doWarp"><script><block s="doReport"><block s="evaluate"><block var="helper"/><list><block var="data"/><block s="reportNewList"><list></list></block></list></block></block></script></block></script></block-definition><block-definition s="remove duplicates from %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="209" collapsed="false">Reports a new list whose items are the same as in the input list, except that if two or more equal items appear in the input list, only the last one is kept in the result.</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block><script><block s="doReport"><custom-block s="remove duplicates from %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="remove duplicates from %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script></block></script></block></script></block-definition><block-definition s="sort %&apos;data&apos; ordering with %&apos;function&apos;" type="reporter" category="lists"><comment x="0" y="0" w="204" collapsed="false">Reports a sorted version of the list in its first input slot, using the comparison function in the second input slot.  For a list of numbers, using &lt; as the comparison function will sort from low to high; using &gt; will sort from high to low.</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%predRing"></input></inputs><script><block s="doDeclareVariables"><list><l>even items</l><l>odd items</l><l>merge</l></list></block><block s="doSetVar"><l>odd items</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><l></l><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><l/></block><block s="evaluate"><block var="even items"/><list><block s="reportCDR"><l/></block></list></block></block></block></script><list></list></block></block><block s="doSetVar"><l>even items</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><l></l><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="evaluate"><block var="odd items"/><list><block s="reportCDR"><l/></block></list></block></block></script><list></list></block></block><block s="doSetVar"><l>merge</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><block var="#1"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="#2"/></block></script></block><block s="doIf"><block s="reportEquals"><block var="#2"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="#1"/></block></script></block><block s="doIfElse"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>1</l><block var="#2"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="evaluate"><block var="merge"/><list><block s="reportCDR"><block var="#1"/></block><block var="#2"/></list></block></block></block></script><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="#2"/></block><block s="evaluate"><block var="merge"/><list><block var="#1"/><block s="reportCDR"><block var="#2"/></block></list></block></block></block></script></block></script><list><l>#1</l><l>#2</l></list></block></block><block s="doIf"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportCDR"><block var="data"/></block><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doReport"><block s="evaluate"><block var="merge"/><list><custom-block s="sort %l ordering with %predRing"><block s="evaluate"><block var="odd items"/><list><block var="data"/></list></block><block var="function"/></custom-block><custom-block s="sort %l ordering with %predRing"><block s="evaluate"><block var="even items"/><list><block var="data"/></list></block><block var="function"/></custom-block></list></block></block></script></block-definition><block-definition s="assoc %&apos;key&apos; %&apos;a-list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="289.3333333333333" collapsed="false">The second input is an &quot;association list,&quot; a list of two-item lists.  Each of those smaller lists has a &quot;key&quot; as its first item and a &quot;value&quot; as its second.  ASSOC reports the first key-value pair in the association list whose key matches the first input.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="a-list"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="key"/><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="a-list"/></block></block></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="a-list"/></block></block></script></block><block s="doReport"><custom-block s="assoc %s %l"><block var="key"/><block s="reportCDR"><block var="a-list"/></block></custom-block></block></script></block-definition><block-definition s="%&apos;#&apos; map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doSetVar"><l>#</l><block var="count"/></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></block></script><list><l>data</l><l>count</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doSetVar"><l>#</l><block var="count"/></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="%upvar map %repRing over %mult%l"><l>#</l><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="%upvar map %repRing over %mult%l"><l>#</l><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></block></script><list><l>data lists</l><l>count</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block><l>1</l></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/><l>1</l></list></block></block></script></block></script></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block></block></script></block-definition><block-definition s="%&apos;#&apos; keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>keep-helper</l></list></block><block s="doSetVar"><l>keep-helper</l><block s="reifyScript"><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doSetVar"><l>#</l><block var="count"/></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><block s="evaluate"><block var="keep-helper"/><list><block s="reportCDR"><block var="data"/></block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></block></script><script><block s="doReport"><block s="evaluate"><block var="keep-helper"/><list><block s="reportCDR"><block var="data"/></block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></script></block></script></block></script><list><l>data</l><l>count</l></list></block></block><block s="doReport"><block s="evaluate"><block var="keep-helper"/><list><block var="data"/><l>1</l></list></block></block></script></block-definition><block-definition s="%&apos;#&apos; for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%ca"></input></inputs><script><block s="doSetVar"><l>#</l><l>1</l></block><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block><block s="doChangeVar"><l>#</l><l>1</l></block></script></block></script></block-definition><block-definition s="if %&apos;a&apos; then %&apos;b&apos; else %&apos;c&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%b"></input><input type="%anyUE"></input><input type="%anyUE"></input></inputs><script><block s="doIf"><block var="a"/><script><block s="doReport"><block s="evaluate"><block var="b"/><list></list></block></block></script></block><block s="doReport"><block s="evaluate"><block var="c"/><list></list></block></block></script></block-definition><block-definition s="ask %&apos;s&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doAsk"><block var="s"/></block><block s="doReport"><block s="getLastAnswer"></block></block></script></block-definition><block-definition s="just %&apos;value&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="value"/></list></block></block></script></block-definition><block-definition s="nothing" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block-definition><block-definition s="%&apos;j&apos; = just %&apos;x&apos;" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%upvar"></input></inputs><script><block s="doIf"><block s="reportAnd"><block s="reportIsA"><block var="j"/><l><option>list</option></l></block><block s="reportEquals"><block s="reportListLength"><block var="j"/></block><l>1</l></block></block><script><block s="doSetVar"><l>x</l><block s="reportListItem"><l>1</l><block var="j"/></block></block><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block-definition><block-definition s="let %&apos;v&apos; = %&apos;value&apos; in %&apos;expr&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s"></input><input type="%anyUE"></input></inputs><script><block s="doSetVar"><l>v</l><block var="value"/></block><block s="doReport"><block s="evaluate"><block var="expr"/><list></list></block></block></script></block-definition><block-definition s="get state" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block var="s"/><block var="s"/></list></block></autolambda><list><l>s</l></list></block></block></script></block-definition><block-definition s="set state to %&apos;new state&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reportNewList"><list><l></l><block var="new state"/></list></block></autolambda><list><l>s</l></list></block></block></script></block-definition><block-definition s="modify state with %&apos;f&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reportNewList"><list><l></l><block s="evaluate"><block var="f"/><list><block var="s"/></list></block></list></block></autolambda><list><l>s</l></list></block></block></script></block-definition><block-definition s="using monad %&apos;monad&apos; do %&apos;getList&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>list</l><l>step</l><l>evaluated</l></list></block><block s="doSetVar"><l>list</l><custom-block s="if %b then %anyUE else %anyUE"><block s="reportIsA"><block var="getList"/><l><option>list</option></l></block><block var="getList"/><block s="evaluate"><block s="reifyReporter"><script><block s="doRun"><block var="getList"/><list><block var="l"/></list></block><block s="doReport"><block var="l"/></block></script><list><l>l</l></list></block><list><block s="reportNewList"><list></list></block></list></block></custom-block></block><block s="doIf"><custom-block s="empty? %l"><block var="list"/></custom-block><script><block s="doReport"><l></l></block></script></block><block s="doSetVar"><l>step</l><block s="reportListItem"><l>1</l><block var="list"/></block></block><block s="doSetVar"><l>evaluated</l><block s="evaluate"><block s="reportListItem"><l>2</l><block var="step"/></block><list></list></block></block><block s="doReport"><custom-block s="if %b then %anyUE else %anyUE"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="step"/></block><l>bind</l></block><custom-block s="%l %s &gt;&gt;= %repRing"><block var="monad"/><block var="evaluated"/><block s="reifyScript"><script><block s="doRun"><block s="reifyScript"><script><block s="doSetVar"><l></l><l></l></block></script><list></list></block><list><block s="reportListItem"><l>3</l><block var="step"/></block><l></l></list></block><block s="doReport"><custom-block s="using monad %l do %cs"><block var="monad"/><block s="reportCDR"><block var="list"/></block></custom-block></block></script><list></list></block></custom-block><custom-block s="if %b then %anyUE else %anyUE"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="step"/></block><l>if</l></block><custom-block s="if %b then %anyUE else %anyUE"><block var="evaluated"/><custom-block s="using monad %l do %cs"><block var="monad"/><block s="reportListItem"><l>3</l><block var="step"/></block></custom-block><custom-block s="using monad %l do %cs"><block var="monad"/><block s="reportListItem"><l>4</l><block var="step"/></block></custom-block></custom-block><custom-block s="%l return %s"><block var="monad"/><block var="evaluated"/></custom-block></custom-block></custom-block></block></script></block-definition><block-definition s="%&apos;list&apos; %&apos;value&apos; &gt;&gt;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"></input><input type="%anyUE"></input></inputs><script><block s="doDeclareVariables"><list><l>_</l></list></block><block s="doAddToList"><block s="reportNewList"><list><l>bind</l><block var="value"/><block s="reifyReporter"><autolambda><block var="_"/></autolambda><list></list></block></list></block><block var="list"/></block></script></block-definition><block-definition s="%&apos;list&apos; return %&apos;value&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"></input><input type="%anyUE"></input></inputs><script><block s="doAddToList"><block s="reportNewList"><list><l>return</l><block var="value"/></list></block><block var="list"/></block></script></block-definition><block-definition s="%&apos;list&apos; %&apos;x&apos; &lt;- %&apos;value&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"></input><input type="%upvar"></input><input type="%anyUE"></input></inputs><script><block s="doAddToList"><block s="reportNewList"><list><l>bind</l><block var="value"/><block s="reifyReporter"><autolambda><block var="x"/></autolambda><list></list></block></list></block><block var="list"/></block></script></block-definition><block-definition s="%&apos;list&apos; if %&apos;condition&apos; then %&apos;true block&apos; else %&apos;false block&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"></input><input type="%boolUE"></input><input type="%cs"></input><input type="%cs"></input></inputs><script><block s="doAddToList"><block s="reportNewList"><list><l>if</l><block var="condition"/><block var="true block"/><block var="false block"/></list></block><block var="list"/></block></script></block-definition></blocks><variables><variable name="maybe"><list id="1536"><item><context id="1537"><inputs><input>value</input><input>comp</input></inputs><variables></variables><custom-block s="if %b then %anyUE else %anyUE"><custom-block s="%s = just %upvar"><block var="value"/><l>x</l></custom-block><block s="evaluate"><block var="comp"/><list><block var="x"/></list></block><custom-block s="nothing"></custom-block></custom-block><receiver><ref id="8"></ref></receiver><origin><ref id="8"></ref></origin><context id="1553"><inputs></inputs><variables></variables><receiver><ref id="8"></ref></receiver><origin><ref id="8"></ref></origin></context></context></item><item><context id="1555"><inputs></inputs><variables></variables><custom-block s="just %s"><l></l></custom-block><receiver><ref id="8"></ref></receiver><origin><ref id="8"></ref></origin></context></item></list></variable><variable name="state"><list id="1560"><item><context id="1561"><inputs><input>value</input><input>comp</input></inputs><variables></variables><block s="reifyReporter"><autolambda><custom-block s="let %upvar = %s in %anyUE"><l>x and new state</l><block s="evaluate"><block var="value"/><list><block var="current state"/></list></block><block s="evaluate"><block s="evaluate"><block var="comp"/><list><block s="reportListItem"><l>1</l><block var="x and new state"/></block></list></block><list><block s="reportListItem"><l>2</l><block var="x and new state"/></block></list></block></custom-block></autolambda><list><l>current state</l></list></block><receiver><ref id="156"></ref></receiver><origin><ref id="156"></ref></origin><context id="1595"><inputs></inputs><variables></variables><receiver><ref id="156"></ref></receiver><origin><ref id="156"></ref></origin></context></context></item><item><context id="1597"><inputs><input>x</input></inputs><variables></variables><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block var="x"/><block var="state"/></list></block></autolambda><list><l>state</l></list></block><receiver><ref id="156"></ref></receiver><origin><ref id="156"></ref></origin></context></item></list></variable><variable name="list"><list id="1611"><item><context id="1612"><inputs><input>value</input><input>comp</input></inputs><variables></variables><custom-block s="append %mult%l"><custom-block s="%upvar map %repRing over %mult%l"><l>#</l><block var="comp"/><list><block var="value"/></list></custom-block></custom-block><receiver><ref id="315"></ref></receiver><origin><ref id="315"></ref></origin><context id="1624"><inputs></inputs><variables></variables><receiver><ref id="315"></ref></receiver><origin><ref id="315"></ref></origin></context></context></item><item><context id="1626"><inputs><input>x</input></inputs><variables></variables><block s="reportNewList"><list><block var="x"/></list></block><receiver><ref id="315"></ref></receiver><origin><ref id="315"></ref></origin></context></item></list></variable></variables></project><media name="Monads" app="Snap! 5.0, http://snap.berkeley.edu" version="1"></media></snapdata>