<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8980149464912824496</id><updated>2012-01-28T06:17:32.259-08:00</updated><category term='C#'/><category term='Go'/><category term='Computer Science'/><category term='Rabbits'/><category term='fsharp'/><category term='S-Expressions'/><category term='AI'/><category term='DSL'/><category term='Poetry'/><category term='TAoCP'/><category term='Philosophy'/><category term='F#'/><category term='Expert Systems'/><title type='text'>TechNeilogy</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default?start-index=101&amp;max-results=100'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>122</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-3886992535754337072</id><published>2012-01-27T18:32:00.000-08:00</published><updated>2012-01-27T18:32:47.345-08:00</updated><title type='text'>Mixins Simplify Composition in Scala</title><content type='html'>&lt;html xmlns:v="urn:schemas-microsoft-com:vml"xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:w="urn:schemas-microsoft-com:office:word"xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"xmlns="http://www.w3.org/TR/REC-html40"&gt;&lt;head&gt;&lt;meta http-equiv=Content-Type content="text/html; charset=windows-1252"&gt;&lt;meta name=ProgId content=Word.Document&gt;&lt;meta name=Generator content="Microsoft Word 14"&gt;&lt;meta name=Originator content="Microsoft Word 14"&gt;&lt;link rel=File-List href="Mixins_files/filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:DocumentProperties&gt;  &lt;o:Author&gt;Neil P. Carrier&lt;/o:Author&gt;  &lt;o:LastAuthor&gt;Neil P. Carrier&lt;/o:LastAuthor&gt;  &lt;o:Revision&gt;20&lt;/o:Revision&gt;  &lt;o:TotalTime&gt;69&lt;/o:TotalTime&gt;  &lt;o:Created&gt;2012-01-28T01:24:00Z&lt;/o:Created&gt;  &lt;o:LastSaved&gt;2012-01-28T02:31:00Z&lt;/o:LastSaved&gt;  &lt;o:Pages&gt;4&lt;/o:Pages&gt;  &lt;o:Words&gt;1487&lt;/o:Words&gt;  &lt;o:Characters&gt;8480&lt;/o:Characters&gt;  &lt;o:Company&gt; TechNeilogy&lt;/o:Company&gt;  &lt;o:Lines&gt;70&lt;/o:Lines&gt;  &lt;o:Paragraphs&gt;19&lt;/o:Paragraphs&gt;  &lt;o:CharactersWithSpaces&gt;9948&lt;/o:CharactersWithSpaces&gt;  &lt;o:Version&gt;14.00&lt;/o:Version&gt; &lt;/o:DocumentProperties&gt; &lt;o:OfficeDocumentSettings&gt;  &lt;o:AllowPNG/&gt; &lt;/o:OfficeDocumentSettings&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;link rel=themeData href="Mixins_files/themedata.thmx"&gt;&lt;link rel=colorSchemeMapping href="Mixins_files/colorschememapping.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:WordDocument&gt;  &lt;w:SpellingState&gt;Clean&lt;/w:SpellingState&gt;  &lt;w:GrammarState&gt;Clean&lt;/w:GrammarState&gt;  &lt;w:TrackMoves&gt;false&lt;/w:TrackMoves&gt;  &lt;w:TrackFormatting/&gt;  &lt;w:PunctuationKerning/&gt;  &lt;w:ValidateAgainstSchemas/&gt;  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;  &lt;w:DoNotPromoteQF/&gt;  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;  &lt;w:Compatibility&gt;   &lt;w:BreakWrappedTables/&gt;   &lt;w:SnapToGridInCell/&gt;   &lt;w:WrapTextWithPunct/&gt;   &lt;w:UseAsianBreakRules/&gt;   &lt;w:DontGrowAutofit/&gt;   &lt;w:SplitPgBreakAndParaMark/&gt;   &lt;w:EnableOpenTypeKerning/&gt;   &lt;w:DontFlipMirrorIndents/&gt;   &lt;w:OverrideTableStyleHps/&gt;  &lt;/w:Compatibility&gt;  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;m:mathPr&gt;   &lt;m:mathFont m:val="Cambria Math"/&gt;   &lt;m:brkBin m:val="before"/&gt;   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;   &lt;m:smallFrac m:val="off"/&gt;   &lt;m:dispDef/&gt;   &lt;m:lMargin m:val="0"/&gt;   &lt;m:rMargin m:val="0"/&gt;   &lt;m:defJc m:val="centerGroup"/&gt;   &lt;m:wrapIndent m:val="1440"/&gt;   &lt;m:intLim m:val="subSup"/&gt;   &lt;m:naryLim m:val="undOvr"/&gt;  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt; &lt;/w:LatentStyles&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-520092929 1073786111 9 0 415 0;}@font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627400839 -2147483648 8 0 66047 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:Calibri; mso-bidi-font-family:"Times New Roman";}p.MsoAcetate, li.MsoAcetate, div.MsoAcetate {mso-style-noshow:yes; mso-style-priority:99; mso-style-link:"Balloon Text Char"; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-fareast-font-family:Calibri;}span.BalloonTextChar {mso-style-name:"Balloon Text Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Balloon Text"; mso-ansi-font-size:8.0pt; mso-bidi-font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-ascii-font-family:Tahoma; mso-hansi-font-family:Tahoma; mso-bidi-font-family:Tahoma;}span.SpellE {mso-style-name:""; mso-spl-e:yes;}span.GramE {mso-style-name:""; mso-gram-e:yes;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-fareast-font-family:Calibri; mso-hansi-font-family:Calibri; mso-bidi-font-family:Calibri;}@page WordSection1 {size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;}div.WordSection1 {page:WordSection1;}--&gt;&lt;/style&gt;&lt;!--[if gte mso 10]&gt;&lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Calibri","sans-serif";}table.MsoTableGrid {mso-style-name:"Table Grid"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-priority:59; mso-style-unhide:no; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-bidi-font-family:"Times New Roman";}&lt;/style&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:shapedefaults v:ext="edit" spidmax="1026"/&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:shapelayout v:ext="edit"&gt;  &lt;o:idmap v:ext="edit" data="1"/&gt; &lt;/o:shapelayout&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;/head&gt;&lt;body lang=EN-US style='tab-interval:.5in'&gt;&lt;div class=WordSection1&gt;&lt;p class=MsoNormal&gt;Scala has a nifty feature called “traits.”&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;A trait is a means of encapsulating methodsand fields that behaves in some ways like an interface, and in other ways likean abstract class.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;Like an interface orabstract class, a trait can declare methods and fields that must later bedefined in some concrete class.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;Like anabstract class, but unlike an interface, a trait can also supply default bodiesand values for those methods and fields.&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;Unlike a class, however, a trait cannot have constructor parameters.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;Here is a simple trait that specifies aniterator:&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span class=GramE&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt; [A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;span class=GramE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; next(): A&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;hasNext&lt;/span&gt;: Boolean&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;In the first of these roles, traits can be used just liketraditional interfaces: as a way of specifying the external behavior of anobject without saying anything about its implementation.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;In the second of these roles, traits can beused like abstract base classes, supplying both declarations anddefinitions.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;However – and this is the really cool part – since traitsare not classes, multiple traits can be specified for a single object withoutviolating single inheritance constraints.&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;So, like interfaces, multiple traits can contribute to a classdeclaration, but unlike either interfaces or single base classes, multipletraits can also contribute to a class definition.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;This is sometimes called “&lt;span class=SpellE&gt;mixin&lt;/span&gt;”inheritance, because the capabilities are “mixed into” other types.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;The example here develops a simple set of iterator traitsand classes.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;Iterators were chosenbecause they are a simple construct which can nevertheless illustrate somepowerful &lt;span class=SpellE&gt;mixin&lt;/span&gt; concepts.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;Of course, the standard Scala librarycontains a much more sophisticated set of iterator traits and classes, and you’llwant to use those rather than mine for real-world programming.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;In particular, to keep things simple, Iignore covariance and &lt;span class=SpellE&gt;contravariance&lt;/span&gt;, which can beexplicitly controlled in Scala types. &lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;(And as always, thecode and information here are presented &amp;quot;as-is&amp;quot; and without warrantyor implied fitness of any kind; use it at your own risk.) &lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;(The code is presented in fragments; a complete listing isat the bottom.)&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;Recalling the simple iterator example from above:&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;span style='font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt; [A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; next(): A&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;hasNext&lt;/span&gt;: Boolean&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;This trait is parameterized on the iterated type, the “[]”brackets delineating type parameters in Scala.&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;Also, the methods follow the standard Scala practice for methods withoutarguments: if the method modifies the object, parentheses are used, if it doesnot modify the object, the parentheses are omitted.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;In this case, the iterator supplies only declarations, andso is used in an interface role.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;(Infact, it resembles the actual Iterator trait from Scala.)&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;We could supply functionality via anothertrait or concrete class, but we’ll actually do it using an abstract class.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;The abstract class below defines iterationacross a range of integers, and delegates the conversion from integer toiterated type to its derived classes using the abstract function“current.”&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;Inheritors can get basiciteration capability simply by defining this function.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;abstract&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;class&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyCursorIter&lt;/span&gt;[A] (&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; first: &lt;span class=SpellE&gt;Int&lt;/span&gt;, &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; last: &lt;span class=SpellE&gt;Int&lt;/span&gt;) &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt;[A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; cursor = first - 1&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; current: A&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; next() = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; (&lt;span class=SpellE&gt;hasNext&lt;/span&gt;) {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;cursor += 1&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;current&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; Exception(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;Iteration past end.&amp;quot;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;hasNext&lt;/span&gt; = cursor &amp;lt;last &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly'&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;Note that first trait or the base class is mixed in usingthe “extends” keyword; subsequent traits are mixed in using the “with” keyword.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;Once you have an iterator, you can use it to do all sorts ofwonderful things.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;But perhaps the mostwonderful of all is the higher order function: “fold.”&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;Fold is a good candidate for the second roleof traits: defining methods and values.&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;Below is a definition of a fold trait as applied to the “&lt;spanclass=SpellE&gt;MyIter&lt;/span&gt;” trait:&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt;[A] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;@&lt;span class=SpellE&gt;tailrec&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;final&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; fold[B] (&lt;span class=SpellE&gt;acc&lt;/span&gt;: B, f:(B,A)=&amp;gt; B): B = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; (&lt;span class=SpellE&gt;hasNext&lt;/span&gt;) {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;fold(f(&lt;span class=SpellE&gt;acc,next&lt;/span&gt;()),f)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;} &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;acc&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;} &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;The curious-looking line “this: &lt;span class=SpellE&gt;MyIter&lt;/span&gt;[A]=&amp;gt;“ tells the compiler that this trait will only be applied to types thatalso support the “&lt;span class=SpellE&gt;MyIter&lt;/span&gt;[A]” trait.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;This is what allows you to use members “&lt;spanclass=SpellE&gt;hasNext&lt;/span&gt;” and “next()” from that trait.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;“@&lt;span class=SpellE&gt;tailrec&lt;/span&gt;” on thefold function tells the Scala compiler that the function should be madetail-recursive, and to warn you at compile time if that is not possible.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;What follows is a standard fold function thattakes an initial result “&lt;span class=SpellE&gt;acc&lt;/span&gt;” (for &lt;bstyle='mso-bidi-font-weight:normal'&gt;acc&lt;/b&gt;umulator), and steps through theelements passing on the result of applying the function “f” to the previousresult and each element, finally returning the last result.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;Fold is like the Swiss Army Knife of higher order functionsin that it can be used to implement a whole range of other higher orderfunctions.&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;The fragment below shows acouple of other mixins which use fold. The first computes the length of aniterated sequence and the second converts an iterated sequence to a list.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;Note the use of the “this: … =&amp;gt;” constructto inform the compiler that these traits extend types with the fold trait.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;And note also the use of the “_” in “this: &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[_] =&amp;gt;” in &lt;span class=SpellE&gt;MyLength&lt;/span&gt; whichindicates that the type parameter is not important for this definition.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;Also note that both functions consume theiterator, leaving it empty.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyLength&lt;/span&gt; {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[_] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; length() = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;fold(0, (b: &lt;span class=SpellE&gt;Int&lt;/span&gt;, _) =&amp;gt; b + 1)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyToList&lt;/span&gt;[A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[A] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;toList&lt;/span&gt;() =&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;fold(Nil, (b: List[A], a: A) =&amp;gt; a::b).reverse&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;And, for convenience, here is a trait that mixes a resetfunction into the “&lt;span class=SpellE&gt;MyCursorIter&lt;/span&gt;” class.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;If an iterator can be made resettable,functions can be written that consume it without rendering it useless forfurther computation.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyReset&lt;/span&gt; {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyCursorIter&lt;/span&gt;[_] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; reset() = cursor = first - 1 &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;At last, time for the first concrete implementation.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;And here it is, “&lt;span class=SpellE&gt;MyStringIter&lt;/span&gt;,”a character iterator across strings:&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;class&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyStringIter&lt;/span&gt; (s: String) &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyCursorIter&lt;/span&gt;[Char](0,s.length - 1)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyReset&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[Char] &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyLength&lt;/span&gt; &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyToList&lt;/span&gt;[Char] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; current = s(cursor)&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;And the test:&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;object&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; Test00 {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; main(&lt;span class=SpellE&gt;args&lt;/span&gt;:Array[String]): Unit = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// String example.&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;spanstyle='mso-spacerun:yes'&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;msi&lt;/span&gt; = &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyStringIter&lt;/span&gt;(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;This is a test.&amp;quot;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msi.toList&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;msi.reset&lt;/span&gt;()&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msi.length&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly'&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;But wait!&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;There’smore!&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;In Scala you can use all thesetraits and classes to cobble together types on the fly.&lt;spanstyle='mso-spacerun:yes'&gt;  &lt;/span&gt;The extended test below illustrates this bydefining, with the test function itself, an ad-hoc iterator across integerranges.&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;object&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; Test00 {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; main(&lt;span class=SpellE&gt;args&lt;/span&gt;:Array[String]): Unit = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// String example.&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;spanstyle='mso-spacerun:yes'&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;msi&lt;/span&gt; = &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyStringIter&lt;/span&gt;(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;This is a test.&amp;quot;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msi.toList&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;msi.reset&lt;/span&gt;()&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msi.length&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// Range example.&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;spanstyle='mso-spacerun:yes'&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;msr&lt;/span&gt; = &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyCursorIter&lt;/span&gt;[&lt;span class=SpellE&gt;Int&lt;/span&gt;](0,9)&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyReset&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyFold&lt;/span&gt;[&lt;span class=SpellE&gt;Int&lt;/span&gt;] &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyToList&lt;/span&gt;[&lt;span class=SpellE&gt;Int&lt;/span&gt;]&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;{ &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; current =cursor }&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msr.toList&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;msr.reset&lt;/span&gt;()&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// Error!&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;spanclass=SpellE&gt;MyLength&lt;/span&gt; is not mixed-in to &lt;span class=SpellE&gt;&lt;u&gt;msr&lt;/u&gt;&lt;/span&gt;.&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// &lt;span class=SpellE&gt;&lt;u&gt;println&lt;/u&gt;&lt;/span&gt;(&lt;span class=SpellE&gt;msr.length&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly'&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;Now isn’t that cool?&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;-Neil&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;Here is the full listing:&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;/* &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* Use of this software is governed by &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* the following license:&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* The MIT License (MIT)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;*http://www.opensource.org/licenses/mit-license.php&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* Copyright (c) 2012 Neil P. Carrier&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;*&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;,WITHOUT &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* INCLUDING BUT NOT LIMITED TO THE WARRANTIES &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* PURPOSE AND NONINFRINGEMENT. IN NO EVENT &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* LIABILITY, WHETHER IN AN ACTION OF CONTRACT,&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* TORT OR OTHERWISE, ARISING FROM, OUT OF &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* OR IN CONNECTION WITH THE SOFTWARE OR THEUSE &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;* OR OTHER DEALINGS IN THE SOFTWARE.&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;*&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;&lt;spanstyle='mso-spacerun:yes'&gt; &lt;/span&gt;*/&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;package&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;com.techneilogy.test00&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;import&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;annotation.tailrec&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt; [A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; next(): A&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;hasNext&lt;/span&gt;: Boolean&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;abstract&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;class&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyCursorIter&lt;/span&gt;[A] (&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; first: &lt;span class=SpellE&gt;Int&lt;/span&gt;, &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; last: &lt;span class=SpellE&gt;Int&lt;/span&gt;) &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt;[A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; cursor = first - 1&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; current: A&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; next() = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; (&lt;span class=SpellE&gt;hasNext&lt;/span&gt;) {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;cursor += 1&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;current&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; Exception(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;Iteration past end.&amp;quot;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;hasNext&lt;/span&gt; = cursor &amp;lt;last &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyIter&lt;/span&gt;[A] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;@&lt;span class=SpellE&gt;tailrec&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;final&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; fold[B] (&lt;span class=SpellE&gt;acc&lt;/span&gt;: B, f:(B,A)=&amp;gt; B): B = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; (&lt;span class=SpellE&gt;hasNext&lt;/span&gt;) {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;fold(f(&lt;span class=SpellE&gt;acc,next&lt;/span&gt;()),f)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;} &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;acc&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;} &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyLength&lt;/span&gt; {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[_] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; length() = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;fold(0, (b: &lt;span class=SpellE&gt;Int&lt;/span&gt;, _) =&amp;gt; b + 1)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyToList&lt;/span&gt;[A] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[A] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;toList&lt;/span&gt;() =&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;fold(Nil, (b: List[A], a: A) =&amp;gt; a::b).reverse&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyReset&lt;/span&gt; {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;this&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;: &lt;spanclass=SpellE&gt;MyCursorIter&lt;/span&gt;[_] =&amp;gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; reset() = cursor = first - 1 &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;class&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyStringIter&lt;/span&gt; (s: String) &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyCursorIter&lt;/span&gt;[Char](0,s.length - 1)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyReset&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyFold&lt;/span&gt;[Char] &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyLength&lt;/span&gt; &lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyToList&lt;/span&gt;[Char] {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; current = s(cursor)&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;object&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; Test00 {&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanclass=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; main(&lt;span class=SpellE&gt;args&lt;/span&gt;:Array[String]): Unit = {&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// String example.&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;spanstyle='mso-spacerun:yes'&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;msi&lt;/span&gt; = &lt;/span&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;spanclass=SpellE&gt;MyStringIter&lt;/span&gt;(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;This is a test.&amp;quot;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msi.toList&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;msi.reset&lt;/span&gt;()&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msi.length&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// Range example.&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;spanstyle='mso-spacerun:yes'&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;msr&lt;/span&gt; = &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;     &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyCursorIter&lt;/span&gt;[&lt;span class=SpellE&gt;Int&lt;/span&gt;](0,9)&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyReset&lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyFold&lt;/span&gt;[&lt;span class=SpellE&gt;Int&lt;/span&gt;] &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;span class=SpellE&gt;MyToList&lt;/span&gt;[&lt;span class=SpellE&gt;Int&lt;/span&gt;]&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;       &lt;/span&gt;{ &lt;/span&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt; &lt;/span&gt;&lt;span class=SpellE&gt;&lt;b&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:#7F0055'&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt; current =cursor }&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msr.toList&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;msr.reset&lt;/span&gt;()&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// Error!&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;spanclass=SpellE&gt;MyLength&lt;/span&gt; is not mixed-in to &lt;span class=SpellE&gt;msr&lt;/span&gt;. &lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#3F7F5F'&gt;// &lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;span class=SpellE&gt;msr.length&lt;/span&gt;())&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt;   &lt;/span&gt;&lt;span class=SpellE&gt;println&lt;/span&gt;(&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:#2A00FF'&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New";color:black'&gt;)&lt;/span&gt;&lt;spanstyle='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly;mso-layout-grid-align:none;text-autospace:none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:black'&gt;}&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=MsoNormal style='line-height:11.0pt;mso-line-height-rule:exactly'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-3886992535754337072?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/3886992535754337072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=3886992535754337072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/3886992535754337072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/3886992535754337072'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2012/01/mixins-simplify-composition-in-scala.html' title='Mixins Simplify Composition in Scala'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-7806974973466370393</id><published>2012-01-26T08:35:00.000-08:00</published><updated>2012-01-26T11:24:05.245-08:00</updated><title type='text'>F# vs. Scala, My Take at Year Two</title><content type='html'>I spent a lot of time over the last couple of years learning F#.  Over the last six months, I’ve spent most of my time learning and working in Scala.  During part of both those times, I was working on the same set of code, ported to both languages.  So, though this topic has been covered before, I thought I’d add my few observations from that experience to the great F# vs. Scala debate.&lt;br /&gt;&lt;br /&gt;1) From the standpoint of most programmers, the choice of F# vs. Scala is probably determined by a single external factor: whether one is targeting the .NET ecosystem or the Java ecosystem.  So the real-world debate is less likely to be F# vs. Scala than it is to be F# vs. C# or Scala vs. Java.  &lt;br /&gt;&lt;br /&gt;2) If you know F#, you already know all the really hard stuff you need to know about Scala, and vice versa.  Now I’m not saying there’s 100% overlap between the two languages; each has features and quirks that the other lacks.  But if you’ve reasonably mastered either, you’ve already gotten into the functional/mixed paradigm mindset.  You’ve scaled the cliffs of type inference, case classes, pattern matching, first-class functions, currying, continuations, monads, etc.  To move from F# to Scala or vice versa, you may have to learn moderately different ways to express those ideas, but you don’t have to make the climb all over.&lt;br /&gt;&lt;br /&gt;Now the more technical stuff:&lt;br /&gt;&lt;br /&gt;3) F# syntax is austere and a clean break with the curly brace world, whereas Scala retains much of the curly brace look and feel (while significantly cleaning it up).  This was a deliberate decision on the part of the designers of Scala to ease the transition from Java.  The result depends on your viewpoint: F# code is a more succinct if you’re used to reading it, but Scala is a little friendlier for newcomers.&lt;br /&gt;&lt;br /&gt;4) Both languages are multi-paradigm, but F# favors functional programming whereas Scala favors object-oriented programming.  This is not intended as a comment on the capabilities of the two languages, but rather on the “feel.”  Both are clearly multi-paradigm, it’s just that on an FP to OOP scale of 0 – 9, F# feels more like a 4, and Scala feels more like a 6.&lt;br /&gt;&lt;br /&gt;5) Scala programming rests on a foundation of traits, mixins, and the explicit management of types.  Programmers making either the transition Java -&gt; Scala, or C# -&gt; F# -&gt; Scala, will need to spend time mastering these concepts in order to take full advantage of Scala’s capabilities.  (F# programmers from more academic backgrounds will already be more familiar with these things.)&lt;br /&gt;&lt;br /&gt;6) F#’s higher-order libraries feel a little more pragmatic than do Scala’s.  It’s not that you can do something in F# that you can’t do in Scala, it’s just that I’m often able to find a more precise higher-ordered function quicker in the F# documentation than in the Scala documentation.  (To be fair to Scala, the libraries are evolving, and tend to get cleaner in each version.)&lt;br /&gt;&lt;br /&gt;7) If you’re a .NET programmer without much open-source experience, getting started using Scala is likely to be both terrifying and exhilarating.  What I mean is: if you do .NET programming, you have Visual Studio, and if you have Visual Studio, you have F#, and the F# you have just works – there, out-of-the box, batteries included.  To do Scala, on the other hand, you’re going to have to put together a toolkit for yourself, sometimes pulling resources from various open-source concerns.  But there are a couple of pieces of good news to temper this:  first, Scala is much easier in this regard than much open-source software I’ve encountered; second, the inventors of Scala have started a concern called Typesafe to help centralize these resources (see sidebar links under Scala).&lt;br /&gt;&lt;br /&gt;8) The community experience is excellent in both cases.  Both the F# and the Scala communities are filled with excellent programmers who are passionate about the discipline.  The users and committers of the two languages are their greatest assets.&lt;br /&gt;&lt;br /&gt;I’ll end with two metaphors, the first about F# and Scala themselves, and the second about the two communities:&lt;br /&gt;&lt;br /&gt;F# and Scala remind me of the cases of convergent evolution in the biological world.  They have evolved in different ecosystems, but similar selection pressure has resulted in similar outcomes.  And some of those pressures are among the most important in all of computing: correctness, concurrency, distributed computing, and maintainability.&lt;br /&gt;&lt;br /&gt;And lastly, the F# and Scala communities are less like two rival groups of barbarians storming the same castle than they are like one group of barbarians temporarily divided so they can storm two different castles.  (And storm them for their own good, lol.)&lt;br /&gt;&lt;br /&gt;-Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-7806974973466370393?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/7806974973466370393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=7806974973466370393' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/7806974973466370393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/7806974973466370393'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2012/01/f-vs-scala-my-take-at-year-two.html' title='F# vs. Scala, My Take at Year Two'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-6666888318048747612</id><published>2012-01-02T09:21:00.000-08:00</published><updated>2012-01-02T09:41:47.512-08:00</updated><title type='text'>New Year's Resolution: More Blogging</title><content type='html'>I hope to get back to this blog soon, in fact, it's one of my New Year's resolutions!&lt;br /&gt;&lt;br /&gt;In the meantime, here's a thought.&lt;br /&gt;&lt;br /&gt;It's really easy to write external DSLs using s-expression languages.  A decent parser can be hand written in a few hours, and the eval process is well understood and documented.  (See for example &lt;em&gt;Design Concepts in Programming Languages&lt;/em&gt; by Turbak, et al., or "Abelson and Sussman" on the sidebar of this blog.)&lt;br /&gt;&lt;br /&gt;But all those parentheses!&lt;br /&gt;&lt;br /&gt;Well, if your language works line-by-line, and every line is a cons, you can easily strip away at least one layer of parentheses by simply assuming the entire line is a cons (unless an outer parenthesis really is found).&lt;br /&gt;&lt;br /&gt;For example, here's how it would look in a pretend language:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;(new: client bob)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (set: phone 555-5555)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (set: acct-balance 1000)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (validate!)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;(/new:)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;new: client bob&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; set: phone 555-5555&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; set: acct-balance 1000&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; validate!&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;/new:&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now isn't that better?&lt;br /&gt;&lt;br /&gt;Happy New Year, Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-6666888318048747612?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/6666888318048747612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=6666888318048747612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6666888318048747612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6666888318048747612'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2012/01/i-hope-to-get-back-to-this-blog-soon-in.html' title='New Year&apos;s Resolution: More Blogging'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-1202400323262823982</id><published>2011-08-04T10:24:00.000-07:00</published><updated>2011-08-04T13:16:44.491-07:00</updated><title type='text'>F# Enters the TIOBE Top 20!</title><content type='html'>For the first time, F# has entered the &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;TIOBE Top 20!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The TIOBE index rates programming language popularity based on a number of criteria.  &lt;br /&gt;&lt;br /&gt;This is certainly a feather in the cap of F#, and all those who have worked to promote the language over the last year deserve congratulations.  But now is not the time for the F# community to rest on its laurels.  Let's make Top 10 the new goal!&lt;br /&gt;&lt;br /&gt;-Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-1202400323262823982?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/1202400323262823982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=1202400323262823982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1202400323262823982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1202400323262823982'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/08/f-enters-tiobe-top-20.html' title='F# Enters the TIOBE Top 20!'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-2039632432603993227</id><published>2011-07-05T10:38:00.000-07:00</published><updated>2011-07-05T12:15:02.953-07:00</updated><title type='text'>F# User-Defined Numeric Literals</title><content type='html'>Today’s blog is about something most F# programmers have perhaps never encountered: user-defined numeric literals. I won’t go into too much detail; the available documentation does a much better job than I could:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html"&gt;From the F# specification.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee353820.aspx "&gt;Reference manual page.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fsharppowerpack.codeplex.com/"&gt;F# Power Pack&lt;/a&gt;. (Source code file q.fs in the math section as of this posting.)&lt;br /&gt;&lt;br /&gt;Basically, user-defined numeric literals allow a programmer to define a new numeric type based on suffix of a literal -- similar to built-in numeric literals. (For example, instances of the built-in numeric literal type uint32 can be written as: “42u.”)&lt;br /&gt;&lt;br /&gt;User-defined numeric literals allow the definition of new types by replacing the suffix (“u” in the uint32 example), with any of the characters Q, R, Z, I, N, or G. For example, you could write something that looks like this:&lt;br /&gt;&lt;br /&gt;let x = 425Q&lt;br /&gt;&lt;br /&gt;The programmer supplies a module that determines how the literals are interpreted. The name of the module must be “NumericLiteral,” followed by the suffix it controls (e.g. “NumericLiteralG”). This module must define several functions that determine how numbers of various lengths are handled. You can read about the details in the sources above, but there are five main functions:&lt;br /&gt;&lt;br /&gt;FromZero – Called when a zero is encountered (e.g. 0Q).&lt;br /&gt;FromOne – Called when a one is encountered.&lt;br /&gt;FromInt32 – Numbers from 2 to Int32.MaxValue.&lt;br /&gt;FromInt64 – Numbers from Int32.MaxValue+1 to Int64.MaxValue.&lt;br /&gt;FromString – Even bigger numbers.&lt;br /&gt;&lt;br /&gt;The “smallest” function that can process a number is the one that is called, and a function must exist for the proper range. For instance, if you write “42Q,” a FromInt32 function must exist, and it is the one called.&lt;br /&gt;&lt;br /&gt;Here is a more complete example. It allows for numeric literals which translate binary representations into uint32. This is not particularly useful, since F# already defines the 0b* binary literal form, but it will do as a sample. (And as always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Numeric literal module for 32-bit unsigned &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// binary numbers.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;module&lt;/span&gt; NumericLiteralZ &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; FromZero() &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0u&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; FromOne() &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1u&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; FromString (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; f (acc&lt;span style="color: maroon;"&gt;:&lt;/span&gt;uint32) i (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Length &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; acc&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;[i] &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="background: #fcf0d8;"&gt;'0'&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; f (acc&lt;span style="color: maroon;"&gt;*&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2u&lt;/span&gt;) (i&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;) s &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="background: #fcf0d8;"&gt;'1'&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; f (acc&lt;span style="color: maroon;"&gt;*&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2u&lt;/span&gt;&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1u&lt;/span&gt;) (i&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;)s &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; failwith &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Non-binary digit.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; f &lt;span style="background: #ffeeea;"&gt;0u&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; FromInt32 (n&lt;span style="color: maroon;"&gt;:&lt;/span&gt;int) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; FromString(n&lt;span style="color: maroon;"&gt;.&lt;/span&gt;ToString())&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; FromInt64 (n&lt;span style="color: maroon;"&gt;:&lt;/span&gt;int64) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; FromString(n&lt;span style="color: maroon;"&gt;.&lt;/span&gt;ToString())&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Tests.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; n0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0Z&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; n4 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0000100Z&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; n5 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;101Z&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; nMax &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;11111111111111111111111111111111Z&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// For reference purposes, here is the &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// existing binary syntax; use it in the&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// real world instead of my class above.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; n37 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0b100101u&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;But I think this is the sort of thing that must be used with some caution.  With only six suffixes available (Q, R, Z, I, N, and G), the potential for collision is high.  Also, since this is an uncommon language feature, it is likely to confuse many users who encounter it for the first time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-2039632432603993227?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/2039632432603993227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=2039632432603993227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/2039632432603993227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/2039632432603993227'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/07/f-user-defined-numeric-literals.html' title='F# User-Defined Numeric Literals'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-8052092342612842714</id><published>2011-03-01T10:11:00.000-08:00</published><updated>2011-03-01T10:20:38.403-08:00</updated><title type='text'>More on Significant Whitespace (in F#, Python, Lua, and Ruby)</title><content type='html'>Since I want to add it to my coding “Room of Requirement,” I decided to keep working on the indentation processor a bit and make it more general.  So here is a version that uses an interface to do dependency injection.  (And as always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;There are a couple of things to note:&lt;br /&gt;&lt;br /&gt;1)  The indentation comparison is done through a function on the interface.  This allows the interface to encapsulate *all* the information about the indentation.  This has a number of benefits.  As shown in the example below, it allows some types of data structures to act as their own indentation stack.  Also, in more sophisticated versions, it would allow for custom processing of indentation based on context (e.g. multi-line argument lists, embedded multi-line strings, etc.).&lt;br /&gt;&lt;br /&gt;2)  I left out runtime validity checks in a few spots, leaving it up to the framework to throw an exception.  In a real life implementation, some sort of custom exceptions might be better, so I’ve marked the spots with comments.&lt;br /&gt;&lt;br /&gt;Since I am currently learning Python, Lua, and Ruby, I’m also including transliterations of the F# version into these languages.  Since I am a relative newcomer to them, I apologize for any spots where I may have violated particular language idioms or best practices.&lt;br /&gt;&lt;br /&gt;Of the three, the Python version looks the closest to the F# version, in large part because both languages use a block structure based on significant whitespace.  The code has been tested in Python 3.2 and IronPython 2.6, but may work in earlier versions of either or IronPython 2.7.&lt;br /&gt;&lt;br /&gt;For the Lua version, I chose to use the Lua object model described by Roberto Ierusalimschy in Programming in Lua.  Lua does not have a  native object type, and so objects must be implemented using associative tables.  The way this is done is fascinating, and well worth reading up on even if you’re not planning on using Lua in the immediate future.   It will make you a better programmer.  The code was tested in Lua 5.1.4.&lt;br /&gt;&lt;br /&gt;For the Ruby version, I did manage to use a couple of interesting Ruby-specific string routines.  It was tested in Ruby 1.9.2 and IronRuby 0.9.&lt;br /&gt;&lt;br /&gt;Last, I apologize for any problems in the formatting and/or syntax highlighting of the Lua, Python, and Ruby; I’m still getting tools for blogging in those languages.&lt;br /&gt;&lt;br /&gt;F#:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Callback handler for IndentOMatic.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; IIndentHandler &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Adds a sibling.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;abstract&lt;/span&gt; Add&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;int&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;IIndentHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Compares to the current indent level.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;abstract&lt;/span&gt; Cmp&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;int&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;int&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Pops to the parent.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;abstract&lt;/span&gt; Pop&lt;span style="color: maroon;"&gt;:&lt;/span&gt;unit&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;IIndentHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Pushes a new child.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;abstract&lt;/span&gt; Push&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;int&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;IIndentHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Rudimentary indentation processor.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;module&lt;/span&gt; IndentOMatic &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Converts a string to a string, indent pair.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;private&lt;/span&gt; stringToTag (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; leading l i (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;l &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Chars(i) &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="background: #fcf0d8;"&gt;' '&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; leading l (i&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;) s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; leading s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Length &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Substring(i),i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Process a string and indent. &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; &lt;span style="color: navy;"&gt;private&lt;/span&gt; proc0 (ih&lt;span style="color: maroon;"&gt;:&lt;/span&gt;IIndentHandler) s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Pop the stack, looking for a parent&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// or sibling.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; scanUp (ih&lt;span style="color: maroon;"&gt;:&lt;/span&gt;IIndentHandler) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; ih&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Cmp s i &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | n &lt;span style="color: navy;"&gt;when&lt;/span&gt; n&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; scanUp (ih&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Pop())&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; ih&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Custom exception here, if required.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; failwith &lt;span style="background: #fcf0d8;"&gt;&amp;quot;No matching unindent.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; ih&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Cmp s i &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | n &lt;span style="color: navy;"&gt;when&lt;/span&gt; n&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; proc0 (scanUp ih) s i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; ih&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Add s i &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; ih&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Push s i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Call to process a string. &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; proc ih s &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; t,i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; stringToTag s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; proc0 ih t i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Tree node that implements IIndentHandler.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; IHTestNode (parent&lt;span style="color: maroon;"&gt;:&lt;/span&gt;IHTestNode option,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; tag&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; indent&lt;span style="color: maroon;"&gt;:&lt;/span&gt;int) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Child branches.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; children&lt;span style="color: maroon;"&gt;:&lt;/span&gt;IHTestNode list &lt;span style="color: maroon;"&gt;=&lt;/span&gt; []&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Add a child.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; &lt;span style="color: navy;"&gt;private&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;AddChild s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; child &lt;span style="color: maroon;"&gt;=&lt;/span&gt; IHTestNode(Some(this),s,i)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; children &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; child&lt;span style="color: maroon;"&gt;::&lt;/span&gt;children&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; child &lt;span style="color: maroon;"&gt;:&amp;gt;&lt;/span&gt;IIndentHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// This does any remaining processing&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// for an ongoing node stack,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// and returns the root.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Eol () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; children &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;rev children&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; parent &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | None &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; this&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | Some(p) &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; p&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Eol()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Print the tree.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Print () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;if&lt;/span&gt; indent&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; &lt;span style="color: navy;"&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%s%s&amp;quot;&lt;/span&gt; (String(&lt;span style="background: #fcf0d8;"&gt;' '&lt;/span&gt;,indent)) tag&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; children &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;iter (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (n&lt;span style="color: maroon;"&gt;:&lt;/span&gt;IHTestNode)&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;n&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Print())&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// IIndentHandler members.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// (See IIndentHandler documentation.)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;interface&lt;/span&gt; IIndentHandler &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Add s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; children &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;rev children&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Note: your parent=null test/exception here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; parent&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value&lt;span style="color: maroon;"&gt;.&lt;/span&gt;AddChild s i &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Cmp _ i &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; i &lt;span style="color: maroon;"&gt;-&lt;/span&gt; indent &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Pop () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; children &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;rev children&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Note: your parent=null test/exception here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; parent&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value&lt;span style="color: maroon;"&gt;:&amp;gt;&lt;/span&gt;IIndentHandler &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Push s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;AddChild s i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Generate some test data.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; test &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; seq {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; i &lt;span style="color: navy;"&gt;in&lt;/span&gt; [&lt;span style="background: #ffeeea;"&gt;0..1&lt;/span&gt;] &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; String&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Format(&lt;span style="background: #fcf0d8;"&gt;&amp;quot;{0}&amp;quot;&lt;/span&gt;,i)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; j &lt;span style="color: navy;"&gt;in&lt;/span&gt; [&lt;span style="background: #ffeeea;"&gt;0..1&lt;/span&gt;] &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; String&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Format(&lt;span style="background: #fcf0d8;"&gt;&amp;quot; {0}{1}&amp;quot;&lt;/span&gt;,i,j)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; k &lt;span style="color: navy;"&gt;in&lt;/span&gt; [&lt;span style="background: #ffeeea;"&gt;0..3&lt;/span&gt;] &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; String&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Format(&lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp;&amp;nbsp; {0}{1}{2}&amp;quot;&lt;/span&gt;,i,j,k)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//Generate and print a tree.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;((Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;fold &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; IndentOMatic&lt;span style="color: maroon;"&gt;.&lt;/span&gt;proc &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (IHTestNode(None,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;)&lt;span style="color: maroon;"&gt;:&amp;gt;&lt;/span&gt;IIndentHandler) &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; test)&lt;span style="color: maroon;"&gt;:?&amp;gt;&lt;/span&gt;IHTestNode)&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Eol()&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Print()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Python:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;# Rudimentary indentation processor.&lt;br /&gt;class IndentOMatic():&lt;br /&gt;&lt;br /&gt;    # Converts a string to a string, indent pair.&lt;br /&gt;    @staticmethod&lt;br /&gt;    def __string_to_tag(s):&lt;br /&gt;        i = 0&lt;br /&gt;        l = len(s)&lt;br /&gt;        while i&amp;lt;l:&lt;br /&gt;            if s[i]!=' ': break&lt;br /&gt;            i += 1&lt;br /&gt;        return (s[i:],i)&lt;br /&gt;&lt;br /&gt;    # Process a string and indent. &lt;br /&gt;    @staticmethod&lt;br /&gt;    def __proc0(ih,s,i):&lt;br /&gt;        # Pop the stack, looking for a parent&lt;br /&gt;        # or sibling.&lt;br /&gt;        def __scan_up(ih):&lt;br /&gt;            cmp = ih.cmp(i)&lt;br /&gt;            if cmp&amp;lt;0:&lt;br /&gt;                return __scan_up(ih.pop())&lt;br /&gt;            elif cmp==0:&lt;br /&gt;                return ih&lt;br /&gt;            else:&lt;br /&gt;                # Custom exception here, if required.&lt;br /&gt;                raise Exception(&amp;quot;No matching unindent.&amp;quot;)&lt;br /&gt;        cmp = ih.cmp(i)&lt;br /&gt;        if cmp&amp;lt;0:&lt;br /&gt;            return IndentOMatic.__proc0(__scan_up(ih),s,i)&lt;br /&gt;        elif cmp==0:&lt;br /&gt;            return ih.add(s,i)&lt;br /&gt;        else:&lt;br /&gt;            return ih.push(s,i)&lt;br /&gt;&lt;br /&gt;    # Call to process a string.&lt;br /&gt;    @staticmethod&lt;br /&gt;    def proc(ih,s):&lt;br /&gt;            (t,i) = IndentOMatic.__string_to_tag(s)&lt;br /&gt;            return IndentOMatic.__proc0(ih,t,i)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Tree node that implements the proper functions.&lt;br /&gt;class IHTestNode ():&lt;br /&gt;&lt;br /&gt;  def __init__(self,parent,tag,indent):&lt;br /&gt;      self.parent = parent&lt;br /&gt;      self.tag = tag&lt;br /&gt;      self.indent = indent&lt;br /&gt;      self.children = []&lt;br /&gt;&lt;br /&gt;  # Add a child.&lt;br /&gt;  def __add_child(self,s,i):&lt;br /&gt;      child = IHTestNode(self,s,i)&lt;br /&gt;      self.children.append(child)&lt;br /&gt;      return child&lt;br /&gt;&lt;br /&gt;  # This does any remaining processing&lt;br /&gt;  # for an ongoing node stack,&lt;br /&gt;  # and returns the root.&lt;br /&gt;  def eol (self):&lt;br /&gt;    if self.parent==None:&lt;br /&gt;        return self&lt;br /&gt;    else:&lt;br /&gt;        return self.parent.eol()&lt;br /&gt;&lt;br /&gt;  # Standard overload.&lt;br /&gt;  def __str__(self):&lt;br /&gt;      return self.tag.rjust(self.indent+len(self.tag))&lt;br /&gt;&lt;br /&gt;  # Recursive print.&lt;br /&gt;  def print_me(self):&lt;br /&gt;      print(self)&lt;br /&gt;      for child in self.children:&lt;br /&gt;          child.print_me()&lt;br /&gt;&lt;br /&gt;  # Adds a sibling.&lt;br /&gt;  def add(self,s,i):&lt;br /&gt;      # Note: your parent=None test/exception here.&lt;br /&gt;      return self.parent.__add_child(s,i)&lt;br /&gt;&lt;br /&gt;  # Compares to the current indent level.&lt;br /&gt;  def cmp(self,i):&lt;br /&gt;      return i-self.indent&lt;br /&gt;&lt;br /&gt;  # Pops to the parent.&lt;br /&gt;  def pop(self):&lt;br /&gt;      # Note: your parent=None test/exception here.&lt;br /&gt;      return self.parent&lt;br /&gt;&lt;br /&gt;  # Pushes a new child.&lt;br /&gt;  def push(self,s,i):&lt;br /&gt;      return self.__add_child(s,i)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Test.&lt;br /&gt;&lt;br /&gt;def test():    &lt;br /&gt;    for i in range(0,2):      &lt;br /&gt;        yield &amp;quot;{0}&amp;quot;.format(i)&lt;br /&gt;        for j in range(0,2):     &lt;br /&gt;            yield &amp;quot; {0}{1}&amp;quot;.format(i,j)&lt;br /&gt;            for k in range(0,4):      &lt;br /&gt;                yield &amp;quot;   {0}{1}{2}&amp;quot;.format(i,j,k)&lt;br /&gt;&lt;br /&gt;print(&amp;quot;Begin&amp;quot;)&lt;br /&gt;&lt;br /&gt;ihtn = IHTestNode(None,&amp;quot;Test&amp;quot;,-1)&lt;br /&gt;&lt;br /&gt;for x in test():&lt;br /&gt;    ihtn = IndentOMatic.proc(ihtn,x)&lt;br /&gt;&lt;br /&gt;ihtn = ihtn.eol()&lt;br /&gt;&lt;br /&gt;print(&amp;quot;End&amp;quot;)&lt;br /&gt;&lt;br /&gt;ihtn.print_me()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lua:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;-- Note:&lt;br /&gt;-- I'm a newcomer to Lua;&lt;br /&gt;-- I apologize for any bad practices.&lt;br /&gt;&lt;br /&gt;-- Note:&lt;br /&gt;-- The way OOP works in Lua is elegant,&lt;br /&gt;-- but can be a little confusing at first.&lt;br /&gt;-- For an explanation, see the chapter &lt;br /&gt;-- on OOP in &amp;quot;Programming in Lua&amp;quot; by&lt;br /&gt;-- Roberto Ierusalimschy.&lt;br /&gt;&lt;br /&gt;-- IndentOMatic class.&lt;br /&gt;IndentOMatic = {&lt;br /&gt;&lt;br /&gt;  string_to_tag = function (s)&lt;br /&gt;    local i = 1 -- Lua indexes are one-based.&lt;br /&gt;    local l = s:len()&lt;br /&gt;    while i&amp;lt;=l do&lt;br /&gt;      if s:sub(i,i)~=&amp;quot; &amp;quot; then break end&lt;br /&gt;      i = i+1&lt;br /&gt;    end&lt;br /&gt;    return { tag=s:sub(i,-1), indent=i-1 } &lt;br /&gt;  end, -- string_to_tag&lt;br /&gt;  &lt;br /&gt;  proc_0 = function (ih,s,i)&lt;br /&gt;    function scan_up (ih)&lt;br /&gt;      local cmp = ih:cmp(i)&lt;br /&gt;      if cmp&amp;lt;0 then&lt;br /&gt;        return scan_up(ih:pop())&lt;br /&gt;      elseif cmp==0 then&lt;br /&gt;        return ih&lt;br /&gt;      else&lt;br /&gt;        -- Custom exception here, if required.&lt;br /&gt;        error(&amp;quot;No matching unindent.&amp;quot;)&lt;br /&gt;      end&lt;br /&gt;    end -- scan_up&lt;br /&gt;    local cmp = ih:cmp(i)&lt;br /&gt;    if cmp&amp;lt;0 then&lt;br /&gt;      return IndentOMatic.proc_0(scan_up(ih),s,i)&lt;br /&gt;    elseif cmp==0 then&lt;br /&gt;       return ih:add(s,i)&lt;br /&gt;    else&lt;br /&gt;     return ih:push(s,i)&lt;br /&gt;    end&lt;br /&gt;  end, -- proc_0&lt;br /&gt;  &lt;br /&gt;  proc = function (ih,s)&lt;br /&gt;    local ti = IndentOMatic.string_to_tag(s)&lt;br /&gt;    return IndentOMatic.proc_0(ih,ti.tag,ti.indent)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;} -- IndentOMatic&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- IndentHandler class.&lt;br /&gt;IndentHandler = {&lt;br /&gt;&lt;br /&gt;  -- &amp;quot;Instance&amp;quot; constructor.&lt;br /&gt;  new = function (self,p,t,i)&lt;br /&gt;    local o = {}&lt;br /&gt;    o.parent = p&lt;br /&gt;    o.tag = t&lt;br /&gt;    o.indent = i&lt;br /&gt;    o.children = {}&lt;br /&gt;    setmetatable(o,self)&lt;br /&gt;    self.__index = self&lt;br /&gt;    return o&lt;br /&gt;  end, -- new&lt;br /&gt; &lt;br /&gt;  add_child = function (self,s,i)&lt;br /&gt;    local child = IndentHandler:new(self,s,i)&lt;br /&gt;    self.children[#self.children+1] = child&lt;br /&gt;    return child&lt;br /&gt;  end, -- add_child&lt;br /&gt;  &lt;br /&gt;  eol = function (self)&lt;br /&gt;    if self.parent then&lt;br /&gt;      return self.parent:eol()&lt;br /&gt;    else&lt;br /&gt;      return self&lt;br /&gt;    end&lt;br /&gt;  end, -- eol&lt;br /&gt;  &lt;br /&gt;  print_me = function (self)&lt;br /&gt;    function spaces (i)&lt;br /&gt;      local s = &amp;quot;&amp;quot;&lt;br /&gt;      while i&amp;gt;0 do&lt;br /&gt;         s = s..&amp;quot; &amp;quot;&lt;br /&gt;         i = i-1&lt;br /&gt;      end&lt;br /&gt;      return s&lt;br /&gt;    end&lt;br /&gt;    print(spaces(self.indent)..self.tag)&lt;br /&gt;    for i=1, #self.children do&lt;br /&gt;      self.children[i]:print_me()&lt;br /&gt;    end&lt;br /&gt;  end, -- print_me&lt;br /&gt;&lt;br /&gt;  add = function (self,s,i)&lt;br /&gt;    -- Custom parent null check here, if required.&lt;br /&gt;    return self.parent:add_child(s,i)&lt;br /&gt;  end, -- add&lt;br /&gt;  &lt;br /&gt;  cmp = function (self,i)&lt;br /&gt;    return i-self.indent&lt;br /&gt;  end, -- cmp&lt;br /&gt;  &lt;br /&gt;  pop = function (self)&lt;br /&gt;    -- Custom parent null check here, if required.&lt;br /&gt;    return self.parent&lt;br /&gt;  end, -- pop&lt;br /&gt;  &lt;br /&gt;  push = function (self,s,i)&lt;br /&gt;   return self:add_child(s,i)&lt;br /&gt;  end -- push&lt;br /&gt;  &lt;br /&gt;} -- IndentHandler&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;e = IndentHandler:new(nil,&amp;quot;root&amp;quot;,-1)&lt;br /&gt;&lt;br /&gt;for i = 0,1 do&lt;br /&gt;  e = IndentOMatic.proc(&lt;br /&gt;        e,string.format(&amp;quot;%d&amp;quot;,i))&lt;br /&gt;  for j = 0,1 do&lt;br /&gt;    e = IndentOMatic.proc(&lt;br /&gt;          e,string.format(&amp;quot; %d%d&amp;quot;,i,j))&lt;br /&gt;    for k = 0,3 do&lt;br /&gt;      e = IndentOMatic.proc(&lt;br /&gt;          e,string.format(&amp;quot;   %d%d%d&amp;quot;,i,j,k))&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;e = e:eol()&lt;br /&gt;e:print_me()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ruby:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;class IndentOMatic&lt;br /&gt;&lt;br /&gt;  def IndentOMatic.string_to_tag (s)&lt;br /&gt;    i = 0&lt;br /&gt;    s.each_char {&amp;#124;x&amp;#124; if x!=' ' then break else i+=1 end}&lt;br /&gt;    [s[i,s.length],i]&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def IndentOMatic.scan_up (ih,i)&lt;br /&gt;    cmp = ih.cmp(i)&lt;br /&gt;    if cmp&amp;lt;0 then&lt;br /&gt;      return IndentOMatic.scan_up(ih.pop(),i)&lt;br /&gt;    elsif cmp==0 &lt;br /&gt;      return ih&lt;br /&gt;    else&lt;br /&gt;      raise &amp;quot;No matching unindent.&amp;quot;&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;    &lt;br /&gt;  def IndentOMatic.proc0 (ih, s, i)&lt;br /&gt;    cmp = ih.cmp(i)&lt;br /&gt;    if cmp&amp;lt;0 then&lt;br /&gt;      return IndentOMatic.proc0(&lt;br /&gt;        IndentOMatic.scan_up(ih,i),s,i)&lt;br /&gt;    elif cmp==0&lt;br /&gt;      return ih.add(s,i)&lt;br /&gt;    else&lt;br /&gt;      return ih.push(s,i)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def IndentOMatic.proc (ih, s)&lt;br /&gt;    t,i = IndentOMatic.string_to_tag(s)&lt;br /&gt;    proc0(ih,t,i)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end # IndentOMatic&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class IndentProcessor&lt;br /&gt;&lt;br /&gt;  def initialize (parent,tag,indent)&lt;br /&gt;    @parent = parent &lt;br /&gt;    @tag = tag &lt;br /&gt;    @indent = indent &lt;br /&gt;    @children = []  &lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def add_child (s, i)&lt;br /&gt;    child = IndentProcessor.new(self,s,i)&lt;br /&gt;    @children &amp;lt;&amp;lt; child&lt;br /&gt;    child&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def eol ()&lt;br /&gt;    if @parent==nil then&lt;br /&gt;      return self&lt;br /&gt;    else&lt;br /&gt;      return @parent.eol()&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def print_me ()&lt;br /&gt;    if @indent&amp;gt;=0 then&lt;br /&gt;      puts (&amp;quot; &amp;quot;*@indent)&amp;lt;&amp;lt;@tag&lt;br /&gt;    end&lt;br /&gt;    @children.each {&amp;#124;c&amp;#124; c.print_me() }&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def add (s, i)&lt;br /&gt;    # Note: your parent=None test/exception here.&lt;br /&gt;    @parent.add_child(s,i)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def cmp (i)&lt;br /&gt;    i-@indent   &lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def pop ()&lt;br /&gt;    # Note: your parent=None test/exception here.&lt;br /&gt;    @parent&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def push (s, i)&lt;br /&gt;    add_child(s,i)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end # IndentProcessor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ih = IndentProcessor.new(nil,&amp;quot;root&amp;quot;,-1)&lt;br /&gt;&lt;br /&gt;ih = IndentOMatic.proc(ih,&amp;quot;a&amp;quot;)&lt;br /&gt;ih = IndentOMatic.proc(ih,&amp;quot;  b&amp;quot;)&lt;br /&gt;ih = IndentOMatic.proc(ih,&amp;quot;    c&amp;quot;)&lt;br /&gt;ih = IndentOMatic.proc(ih,&amp;quot;    d&amp;quot;)&lt;br /&gt;ih = IndentOMatic.proc(ih,&amp;quot;  e&amp;quot;)&lt;br /&gt;&lt;br /&gt;ih = ih.eol()&lt;br /&gt;&lt;br /&gt;ih.print_me()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-8052092342612842714?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/8052092342612842714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=8052092342612842714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/8052092342612842714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/8052092342612842714'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/03/more-on-significant-whitespace-in-f.html' title='More on Significant Whitespace (in F#, Python, Lua, and Ruby)'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-7318599882637731057</id><published>2011-02-26T06:24:00.000-08:00</published><updated>2011-02-26T06:29:23.056-08:00</updated><title type='text'>Significant Whitespace, DSLs, and You (in F#)</title><content type='html'>Today’s post shows some simple code for teasing out the structure of a text file based on its indentation.  &lt;br /&gt;&lt;br /&gt;A trend in computer science is for computer languages to rely more on significant whitespace.  Of course, that is true of F#, but Python has introduced the concept to an even wider audience.  Significant whitespace and structure are also important in the design of domain-specific languages, since these constructs help reduce visual clutter.&lt;br /&gt;&lt;br /&gt;But it pays not to be too strict.  For example, forcing indentation and other structures to be at specific tab stops is likely to be a source of irritation as well as readability.  What is needed is an adaptable system where – if the structure naively looks right, it gets interpreted right by the parser.&lt;br /&gt;&lt;br /&gt;The code below presents on part of a toolkit for doing that.  It takes input a line at a time, and decides whether each new line is a child at new level of indentation, a sibling of the current level, or represents a “pop” upwards to a parent level.  The exact indentation at each level is unimportant, and is set by the first sibling.  Pops back upwards must be to a previously encountered level.&lt;br /&gt;&lt;br /&gt;Of course, a lot of things are missing.  For example, in some languages, individual line indentation is not sufficient; some knowledge of context is required.  And the code below is not really packaged very well; in real use, some sort of encapsulation in a class might be more appropriate.  And as with any code, it could be refactored and perhaps simplified in a number of ways. &lt;br /&gt;&lt;br /&gt;But it shows one basic technique.  (As always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;(FWIW, the test sample is some actual Python code from a “toy” expert system I wrote to help me learn Python.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Rudimentary indentation processor.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;module&lt;/span&gt; IndentOMatic &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// These three functions stand in for &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// real-world functionality.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Add a sibling item.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; add s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printf &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Add : %i %s%s &amp;quot;&lt;/span&gt; i (String(&lt;span style="background: #fcf0d8;"&gt;'-'&lt;/span&gt;,i)) s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Pop a level.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; pop () &lt;span style="color: maroon;"&gt;=&lt;/span&gt; printf &lt;span style="background: #fcf0d8;"&gt;&amp;quot;^&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Push a child item.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; push s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printf &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Push: %i %s%s &amp;quot;&lt;/span&gt; i (String(&lt;span style="background: #fcf0d8;"&gt;'-'&lt;/span&gt;,i)) s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Convert a string to a string*int,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// where the string is the string minus&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// leading spaces and the int is the &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// number of spaces.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;private&lt;/span&gt; stringToTag (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; leading l i (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;l &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Chars(i) &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="background: #fcf0d8;"&gt;' '&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; leading l (i&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;) s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; leading s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Length &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Substring(i),i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Process a string. &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; &lt;span style="color: navy;"&gt;private&lt;/span&gt; proc0 (nl&lt;span style="color: maroon;"&gt;:&lt;/span&gt;int list) s i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Pop the stack, looking for a parent&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// or sibling.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; scanUp &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: navy;"&gt;function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | [] &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; failwith &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Stack underflow.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | h&lt;span style="color: maroon;"&gt;::&lt;/span&gt;t &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;=&lt;/span&gt;h &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; h&lt;span style="color: maroon;"&gt;::&lt;/span&gt;t&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;h &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; failwith &lt;span style="background: #fcf0d8;"&gt;&amp;quot;No matching unindent.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pop()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scanUp t &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; nl &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | [] &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; failwith &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Stack underflow.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | h&lt;span style="color: maroon;"&gt;::&lt;/span&gt;t &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;=&lt;/span&gt;h &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; add s i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; nl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; i&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;h &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push s i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i&lt;span style="color: maroon;"&gt;::&lt;/span&gt;nl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;span style="color: navy;"&gt;false&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; proc0 (scanUp nl) s i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Call to process a string. &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; proc nl s &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; t,i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; stringToTag s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; proc0 nl t i&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test it.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; test &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Some Python code from a &amp;quot;toy&amp;quot; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// expert system.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;class Not():&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; def __init__(self,rule):&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.rule = rule&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; def prove(self,tryProve):&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p = self.rule.prove(tryProve)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if p==None:&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return p&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return not p&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; ]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;fold IndentOMatic&lt;span style="color: maroon;"&gt;.&lt;/span&gt;proc [&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;] test&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The output looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;Push: 0 class Not():&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Push: 4 ----def __init__(self,rule):&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Push: 8 --------self.rule = rule ^&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Add : 4 ----def prove(self,tryProve):&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Push: 8 --------p = self.rule.prove(tryProve)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Add : 8 --------if p==None:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Push: 12 ------------return p ^&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Add : 8 --------else:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Push: 12 ------------return not p&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Your breakpoint here.&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-7318599882637731057?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/7318599882637731057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=7318599882637731057' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/7318599882637731057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/7318599882637731057'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/02/significant-whitespace-dsls-and-you-in.html' title='Significant Whitespace, DSLs, and You (in F#)'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-6217101820472623168</id><published>2011-02-18T12:32:00.000-08:00</published><updated>2011-02-19T07:05:22.505-08:00</updated><title type='text'>Oops!  Correction to Post Dated August 8, 2010</title><content type='html'>Oops!  I found a couple of bugs in the code listed in the blog post titled: &lt;a href="http://techneilogy.blogspot.com/2010/08/segment-tree-in-f.html"&gt;Segment Tree in F#&lt;/a&gt;.  The bugs are in the "findCollect" and "findIter" functions, and they're really rather glaringly obvious (essentially different versions of the same bug).  It looks like a “my-brain-was-out-to-lunch” error as I was transcribing the algorithm either from my head or from pseudo-code.  In any case, it can be caught by a simple unit test or even code review, so I’m embarrassed that it got into the blog.  My humblest apologies.&lt;br /&gt;&lt;br /&gt;In order to avoid repeating the error, I’m thoroughly testing my correction, and I’ll post it when that testing is done.  I’ll also post a better test example (that would have revealed this error).&lt;br /&gt;&lt;br /&gt;In the meantime, the fix is quite simple, so readers may want to try figuring it out on their own.  (Hint: try searching for values completely outside the range of the tree.  This will force the bug to occur.)&lt;br /&gt;&lt;br /&gt;-Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-6217101820472623168?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/6217101820472623168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=6217101820472623168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6217101820472623168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6217101820472623168'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/02/oops-correction-to-post-dated-august-8.html' title='Oops!  Correction to Post Dated August 8, 2010'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-2121464314968537982</id><published>2011-02-07T13:03:00.000-08:00</published><updated>2011-02-07T13:14:35.968-08:00</updated><title type='text'>My Dinner with Haskell</title><content type='html'>It’s impossible to go very far into either the F# world or the world of domain-specific languages (DSLs) without encountering Haskell.  It seems like all the F# gurus are also Haskell gurus, or at least Haskell aficionados, and a lot of people use Haskell for prototyping new languages (including DSLs).  Any search for materials on F# or DSLs likewise leads to information on Haskell.  &lt;br /&gt;&lt;br /&gt;So I decided to learn me some Haskell.&lt;br /&gt;&lt;br /&gt;The first thing I did was to get a working build of the GHC (Glasgow Haskell Compiler) by following the appropriate links at the official &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell site&lt;/a&gt;.   Next, I found some learning materials, including &lt;a href="http://book.realworldhaskell.org/"&gt;Real-World Haskell&lt;/a&gt;, &lt;a href="http://learnyouahaskell.com/"&gt;Learn You a Haskell for Great Good&lt;/a&gt;, &lt;a href="http://en.wikibooks.org/wiki/Haskell"&gt;Haskell Wikibook&lt;/a&gt;, &lt;a href="http://planet.haskell.org/"&gt;Planet Haskell&lt;/a&gt;, and &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/"&gt;Erik Meijer's excellent Channel 9 series&lt;/a&gt;.  (The latter is worth watching for the shirts alone!)&lt;br /&gt;&lt;br /&gt;And then, a couple of days ago, I got to work learning.  And so far…&lt;br /&gt;&lt;br /&gt;…so good.  This is a really fun language, and fairly easy to learn if you already have some experience in F#.  At least, knowing F# gets you past the initial strangeness of concepts like currying, pattern matching, etc.  In fact, knowing F# is a tiny bit of an impediment because the syntax is so similar, the differences are difficult to remember.  But on balance, knowing F# has helped a bunch.  The two languages aren’t exactly siblings, but they are cousins, and I think learning the more formal environment of Haskell will help me with the more pragmatic environment of F#.&lt;br /&gt;&lt;br /&gt;In order to illustrate the two together, below I present “A tiny corner of Lisp…” in both F# and in Haskell.  This being a little fragment of Lisp functionality coded as identically as possible in the two languages.  As always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.  (And since I don’t yet have anything that can syntax highlight Haskell, I deliberately did not syntax highlight the F#.)&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;// A tiny corner of Lisp in F#.&lt;br /&gt;&lt;br /&gt;type Node =&lt;br /&gt;  &amp;#124; Atom of string&lt;br /&gt;  &amp;#124; Cons of Node*Node&lt;br /&gt;  &amp;#124; Nil&lt;br /&gt;&lt;br /&gt;let car = function&lt;br /&gt;  &amp;#124; Cons(h,_) -&amp;gt; h&lt;br /&gt;  &amp;#124; _ -&amp;gt; failwith &amp;quot;Invalid 'car' target.&amp;quot;&lt;br /&gt;&lt;br /&gt;let cdr = function&lt;br /&gt;  &amp;#124; Cons(_,t) -&amp;gt; t&lt;br /&gt;  &amp;#124; _ -&amp;gt; failwith &amp;quot;Invalid 'cdr' target.&amp;quot;&lt;br /&gt;&lt;br /&gt;let rec append nCar nCdr =&lt;br /&gt;  match nCar with&lt;br /&gt;  &amp;#124; Cons(h,t) -&amp;gt; Cons(h, append t nCdr)&lt;br /&gt;  &amp;#124; Nil -&amp;gt; nCdr&lt;br /&gt;  &amp;#124; _ -&amp;gt; failwith &amp;quot;Invalid 'append' target(s).&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Examples.&lt;br /&gt;&lt;br /&gt;let a0 = Atom &amp;quot;a&amp;quot; // a&lt;br /&gt;let c0 = Cons(a0,(Cons((Atom &amp;quot;b&amp;quot;),Nil))) // (a b)&lt;br /&gt;let c1 = append c0 c0 // (a b a b)&lt;br /&gt;let c2 = append c1 a0 // (a b a b . a)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;-- A tiny corner of Lisp in Haskell.&lt;br /&gt;&lt;br /&gt;data Node = Atom String&lt;br /&gt;          &amp;#124; Cons Node Node&lt;br /&gt;          &amp;#124; Nil&lt;br /&gt;    deriving (Show)&lt;br /&gt;&lt;br /&gt;car :: Node -&amp;gt; Node&lt;br /&gt;car (Cons h _) = h&lt;br /&gt;car _ = error &amp;quot;Invalid 'car' target.&amp;quot;&lt;br /&gt;&lt;br /&gt;cdr :: Node -&amp;gt; Node&lt;br /&gt;cdr (Cons _ t) = t&lt;br /&gt;cdr _ = error &amp;quot;Invalid 'cdr' target.&amp;quot;&lt;br /&gt;&lt;br /&gt;append :: Node -&amp;gt; Node -&amp;gt; Node&lt;br /&gt;append (Cons h t) nCdr = (Cons h (append t nCdr))&lt;br /&gt;append Nil nCdr = nCdr &lt;br /&gt;append _ _ = error &amp;quot;Invalid 'append' target(s).&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- Examples.&lt;br /&gt;&lt;br /&gt;a0 = Atom &amp;quot;a&amp;quot; -- a&lt;br /&gt;c0 = Cons a0 (Cons (Atom &amp;quot;b&amp;quot;) Nil) -- (a b)&lt;br /&gt;c1 = append c0 c0 -- (a b a b)&lt;br /&gt;c2 = append c1 a0 -- (a b a b . a)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So get out there and learn you a Haskell for great good!&lt;br /&gt;&lt;br /&gt;-Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-2121464314968537982?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/2121464314968537982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=2121464314968537982' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/2121464314968537982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/2121464314968537982'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/02/my-dinner-with-haskell.html' title='My Dinner with Haskell'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-1117261950283138025</id><published>2011-01-18T06:33:00.000-08:00</published><updated>2011-01-28T18:18:40.531-08:00</updated><title type='text'>Project Euler #1 - One Problem, Three Solutions, Seven Languages</title><content type='html'>I haven’t posted here in a long time, and I apologize for that.  No particular reason, but all good: programming in F#, learning lots of new programming stuff, enjoying the fall and winter holiday season (including hand-making some Christmas gifts), etc.&lt;br /&gt;&lt;br /&gt;As I mentioned, one of the things I’ve been doing is learning new programming skills.  I ignored F# during its early history, and the past year has shown me that was a mistake.  So I decided to take a look at some of the other things I’ve been ignoring.  That led me into various spots, including: Lua, Python, Ruby, MongoDB, MySQL, PostgresQL, Silverlight 4, SVN, Haskell, NetBeans, revisiting Scheme, the world of Visual Studio extensions, etc.&lt;br /&gt;&lt;br /&gt;There’s a popular programming book by Bruce Tate, titled “Seven Languages in Seven Weeks.”  In that spirit, I’d like to present something similar here: three views of Project Euler, problem number one, in seven languages.  Some of these languages I’ve worked in for a long time; some of them I’ve just learned, but here goes.  (As always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;First is F#.  Of all the languages listed here, F# is my favorite.  Not by a wide margin, perhaps, but my favorite nonetheless.  I think this is because of the vision of its creators: to build a language based on thoughtful consideration of all that has come before, both academic and pragmatic.  At this, it succeeds brilliantly.  (And no, Don Syme did not pay me to say this, lol.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Naive Implementation,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// based on problem statement.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Illustrates aggregate operators&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// and pipes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; euler_1_naive a b bound &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; seq {&lt;span style="background: #ffeeea;"&gt;1..&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;} &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;filter (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; i&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;((i&lt;span style="color: maroon;"&gt;%&lt;/span&gt;a&lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;)&lt;span style="color: maroon;"&gt;||&lt;/span&gt;(i&lt;span style="color: maroon;"&gt;%&lt;/span&gt;b&lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;)))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;sum&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Sums stepped ranges.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Illustrates aggregate operators&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// and pipes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; euler_1_iteration a b bound &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (seq {a&lt;span style="color: maroon;"&gt;..&lt;/span&gt;a&lt;span style="color: maroon;"&gt;..&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;} &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;sum)&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (seq {b&lt;span style="color: maroon;"&gt;..&lt;/span&gt;b&lt;span style="color: maroon;"&gt;..&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;} &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;sum)&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (seq {a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b&lt;span style="color: maroon;"&gt;..&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b&lt;span style="color: maroon;"&gt;..&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;} &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;sum)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Numeric (one possible factoring).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Illustrates the use of nested functions,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// closures and immutable parameters.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; euler_1_numeric a b bound &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; f n &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; c &lt;span style="color: maroon;"&gt;=&lt;/span&gt; b1&lt;span style="color: maroon;"&gt;/&lt;/span&gt;n&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; c&lt;span style="color: maroon;"&gt;*&lt;/span&gt;(c&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;)&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;&lt;span style="color: maroon;"&gt;*&lt;/span&gt;n&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (f a)&lt;span style="color: maroon;"&gt;+&lt;/span&gt;(f b)&lt;span style="color: maroon;"&gt;-&lt;/span&gt;(f (a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b))&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Next is Python.  Python is an interesting language; it embodies a lot of characteristics that make it fun and easy to program in: orthogonality, lack of syntactic fluff, etc.  On the other hand, it is a very businesslike language with a lot of excellent libraries available.  If I were Java and C#, I’d watch my back.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;# Python 3.1.3 and NetBeans w/Python plug-in.&lt;br /&gt;&lt;br /&gt;def euler_1_naive (a,b,bound):&lt;br /&gt;    &amp;quot;&amp;quot;&amp;quot;Naive Implementation,&lt;br /&gt;       based on problem statement.&lt;br /&gt;       Illustrates comprehensions&lt;br /&gt;       and implicit booleans.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;    return sum(&lt;br /&gt;      i for i in range(1,bound)&lt;br /&gt;        if (not ((i%a) and (i%b))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def euler_1_iteration (a,b,bound):&lt;br /&gt;    &amp;quot;&amp;quot;&amp;quot;Sums stepped ranges.&lt;br /&gt;       Illustrates aggregate operators.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;    return sum(range(a,bound,a))+\&lt;br /&gt;           sum(range(b,bound,b))-\&lt;br /&gt;           sum(range(a*b,bound,a*b))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def euler_1_numeric (a,b,bound):&lt;br /&gt;    &amp;quot;&amp;quot;&amp;quot;Numeric (one possible factoring).&lt;br /&gt;       Illustrates the use of nested functions&lt;br /&gt;       and closures.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;    bound -= 1&lt;br /&gt;    def f (n):&lt;br /&gt;        &amp;quot;&amp;quot;&amp;quot;Compute sum of n-divisible.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;        c = int(bound/n)&lt;br /&gt;        return int(c*(c+1)/2)*n&lt;br /&gt;    return f(a)+f(b)-f(a*b)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here is Ruby.  What to say about Ruby?  Superficially, it strikes one as incoherent and arbitrary.  But a closer look shows this to be a mistake.  What looked like incoherence and randomness is really richness and a wonderful idiosyncrasy.  Ruby is a complex, Raku bowl of a language, which reflects the mind of its creator, Yukihiro Matsumoto, and records all the incidents and accidents of its history.  Of all the languages here, it is the one that draws the most passion from the programmers who use it, and I can see why.  There’s a lot to be said for a language in which you can do something five times by coding “5.times {…}”&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;# Ruby 1.9.2 and NetBeans w/Ruby plug-in.&lt;br /&gt;&lt;br /&gt;# Naive Implementation,&lt;br /&gt;# based on problem statement.&lt;br /&gt;# Illustrates filtering.&lt;br /&gt;def euler_1_naive (a,b,bound)&lt;br /&gt;  ((0...bound).find_all{&lt;br /&gt;      &amp;#124;i&amp;#124;(i%a==0)&amp;#124;&amp;#124;(i%b==0)}).reduce(:+)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Sums stepped ranges.&lt;br /&gt;# Illustrates aggregate operators.&lt;br /&gt;def euler_1_iteration (a,b,bound)&lt;br /&gt;  (a...bound).step(a).reduce(:+)+&lt;br /&gt;  (b...bound).step(b).reduce(:+)-&lt;br /&gt;  (a*b...bound).step(a*b).reduce(:+)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Numeric (one possible factoring).&lt;br /&gt;# Illustrates the use of lambdas&lt;br /&gt;# and closures.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;def euler_1_numeric (a,b,bound)&lt;br /&gt;  bound -= 1&lt;br /&gt;  #Compute sum of n-divisible.&lt;br /&gt;  f = lambda {&amp;#124;n&amp;#124;&lt;br /&gt;    c = bound/n&lt;br /&gt;    c*(c+1)/2*n&lt;br /&gt;  }&lt;br /&gt;  f.call(a)+f.call(b)-f.call(a*b)&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lua, like Ruby and F#, reflects the visions of its creators.  Like Python, it is simple and orthogonal.  So simple and orthogonal, in fact, that it has only one non-value type: an associative table.  Everything else – objects, lists, arrays, stacks, etc. – must be built using those tables.  Lua’s simplicity and speed, coupled with the fact that it is implemented in a highly portable subset of C, make Lua a great choice for new processors, small machines, embedded scripting and similar environments.  Think of it as a FORTH for the new millennium.  I wish GPU shader languages looked like Lua.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;function euler1Naive (a,b,bound)&lt;br /&gt;  acc = 0&lt;br /&gt;  for i=0,bound-1 do&lt;br /&gt;    if (i%3==0) or (i%5==0) then &lt;br /&gt;      acc = acc+i &lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  return acc&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function euler1Iterative (a,b,bound)&lt;br /&gt;  bound = bound-1&lt;br /&gt;  function f(n) &lt;br /&gt;    acc = 0&lt;br /&gt;    for i=n,bound,n do&lt;br /&gt;      acc = acc+i&lt;br /&gt;    end&lt;br /&gt;    return acc&lt;br /&gt;  end&lt;br /&gt;  return f(a)+f(b)-f(a*b)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function euler1Numeric (a,b,bound)&lt;br /&gt;  bound = bound-1&lt;br /&gt;  function f(n) &lt;br /&gt;    c = math.floor(bound/n)&lt;br /&gt;    return math.floor(c*(c+1)/2)*n&lt;br /&gt;  end&lt;br /&gt;  return f(a)+f(b)-f(a*b)&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Good old Java, C#, and C/C++; the three tireless workhorses of modern computing.  When programmed procedurally, all three are so similar that I will show only a single example: the naïve implementation in Java.  Of course, the reasons why a programmer might prefer one of these languages over the others are real and important, but are simply beyond the scope of a snippet.  In most cases it has to do with platform, ecosystem, and considerations of speed vs. safety.  (In this example, and in the C# case below, I have omitted the enclosing class definition for brevity.)&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public static int euler_1_naive (&lt;br /&gt;    int a,&lt;br /&gt;    int b,&lt;br /&gt;    int bound)&lt;br /&gt;{&lt;br /&gt;    int sum = 0;&lt;br /&gt;    for (int i=1;i&amp;lt;bound;i++)&lt;br /&gt;        if (((i%a)==0)&amp;#124;&amp;#124;((i%b)==0))&lt;br /&gt;           sum += i;&lt;br /&gt;    return sum;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Many procedural languages are growing to become more functional.  To illustrate that, here is an example in C#, which makes us of a locally defined delegate.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// C# 4.0 and Visual Studio 2010.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Sums stepped ranges.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;public&lt;/span&gt; &lt;span style="color: navy;"&gt;static&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; Euler_1_iteration (&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; a,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; b,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; bound) &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Func&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt;,&lt;span style="color: navy;"&gt;int&lt;/span&gt;,&lt;span style="color: navy;"&gt;int&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt; f &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (sum,n) &lt;span style="color: maroon;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; (&lt;span style="color: navy;"&gt;int&lt;/span&gt; i&lt;span style="color: maroon;"&gt;=&lt;/span&gt;n;i&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bound;i&lt;span style="color: maroon;"&gt;+=&lt;/span&gt;n) &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sum&lt;span style="color: maroon;"&gt;+=&lt;/span&gt;i;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; sum; };&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; f(f(&lt;span style="color: maroon;"&gt;-&lt;/span&gt;f(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b),b),a);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;C++0X also adds functional features and other modern constructs to the C++ language.  The example below shows the definition of a lambda and the use of the “auto” keyword (a great boon to readability).  The lambda syntax appears a bit arcane and robotic, but then, everything about C and C++ is a bit arcane and robot.  *Which is exactly what programmers like about it.*  (And if you really, *really* like that kind of thing, you might want to try FORTH.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Numeric (one possible factoring).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Illustrates the use of lambdas, auto&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// and closures.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; euler_1_numeric &lt;span style="color: maroon;"&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; a&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; b&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; bound&lt;span style="color: maroon;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; bound &lt;span style="color: maroon;"&gt;-=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;auto&lt;/span&gt; f &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: maroon;"&gt;[&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;]&lt;/span&gt; &lt;span style="color: maroon;"&gt;(&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; n&lt;span style="color: maroon;"&gt;)&lt;/span&gt; &lt;span style="color: maroon;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;int&lt;/span&gt; c &lt;span style="color: maroon;"&gt;=&lt;/span&gt; bound &lt;span style="color: maroon;"&gt;/&lt;/span&gt; n&lt;span style="color: maroon;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; c&lt;span style="color: maroon;"&gt;*(&lt;/span&gt;c&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;)/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;&lt;span style="color: maroon;"&gt;*&lt;/span&gt;n&lt;span style="color: maroon;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; f&lt;span style="color: maroon;"&gt;(&lt;/span&gt;a&lt;span style="color: maroon;"&gt;)+&lt;/span&gt;f&lt;span style="color: maroon;"&gt;(&lt;/span&gt;b&lt;span style="color: maroon;"&gt;)-&lt;/span&gt;f&lt;span style="color: maroon;"&gt;(&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b&lt;span style="color: maroon;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Last, here are a couple of examples that use template-based metaprogramming in C++.  In case you haven’t encountered that before, it’s basically a way of tricking the compiler into running a program at *compile time* that leaves a correct value or structure in the compiled code.  In these examples, the correct Project Euler #1 value is left in the enumeration value RET.  Template-based metaprogramming can be a bit hard to wrap your mind around at first, and the examples here are not especially reflective of how it might be useful in the real world.  Suffice to say that it can be a powerful technique for creating complex data structures and increasing runtime efficiency (for example, by permitting constant folding and similar techniques in ways that go beyond even optimizing compilers).&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Template metaprogram 1.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Sums stepped ranges.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Illustrates partial template&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// instantiation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;template&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; i&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; acc&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; n&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;struct&lt;/span&gt; SRSum&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;enum&lt;/span&gt; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; RET&lt;span style="color: maroon;"&gt;=&lt;/span&gt;SRSum&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;i&lt;span style="color: maroon;"&gt;,&lt;/span&gt;acc&lt;span style="color: maroon;"&gt;+&lt;/span&gt;i&lt;span style="color: maroon;"&gt;,&lt;/span&gt;n&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;+&lt;/span&gt;acc &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;template&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; i&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; acc&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;struct&lt;/span&gt; SRSum&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;i&lt;span style="color: maroon;"&gt;,&lt;/span&gt;acc&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;enum&lt;/span&gt; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; RET&lt;span style="color: maroon;"&gt;=&lt;/span&gt;acc &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;template&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; a&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; b&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; bound&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;struct&lt;/span&gt; Euler1Iterate&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;enum&lt;/span&gt; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; RET&lt;span style="color: maroon;"&gt;=(&lt;/span&gt;SRSum&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;a&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;&lt;span style="color: maroon;"&gt;,(&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;)/&lt;/span&gt;a&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;)+&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: maroon;"&gt;(&lt;/span&gt;SRSum&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;b&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;&lt;span style="color: maroon;"&gt;,(&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;)/&lt;/span&gt;b&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;)-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: maroon;"&gt;(&lt;/span&gt;SRSum&lt;span style="color: maroon;"&gt;&amp;lt;(&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b&lt;span style="color: maroon;"&gt;),&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;&lt;span style="color: maroon;"&gt;,(&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;)/(&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b&lt;span style="color: maroon;"&gt;)&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Template metaprogram 2.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Numeric.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;template&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; n&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; bound&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;struct&lt;/span&gt; NSum &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;private&lt;/span&gt;&lt;span style="color: maroon;"&gt;:&lt;/span&gt; &lt;span style="color: navy;"&gt;enum&lt;/span&gt; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; C&lt;span style="color: maroon;"&gt;=(&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;)/&lt;/span&gt;n &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;public&lt;/span&gt;&lt;span style="color: maroon;"&gt;:&lt;/span&gt; &lt;span style="color: navy;"&gt;enum&lt;/span&gt; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; RET&lt;span style="color: maroon;"&gt;=&lt;/span&gt;C&lt;span style="color: maroon;"&gt;*(&lt;/span&gt;C&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;span style="color: maroon;"&gt;)/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;&lt;span style="color: maroon;"&gt;*&lt;/span&gt;n &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;template&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; a&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; b&lt;span style="color: maroon;"&gt;,&lt;/span&gt; &lt;span style="color: navy;"&gt;int&lt;/span&gt; bound&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;struct&lt;/span&gt; Euler1Numeric&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;enum&lt;/span&gt; &lt;span style="color: maroon;"&gt;{&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; RET&lt;span style="color: maroon;"&gt;=&lt;/span&gt;NSum&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;a&lt;span style="color: maroon;"&gt;,&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;+&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NSum&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;b&lt;span style="color: maroon;"&gt;,&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NSum&lt;span style="color: maroon;"&gt;&amp;lt;(&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;b&lt;span style="color: maroon;"&gt;),&lt;/span&gt;bound&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test both.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; _tmain&lt;span style="color: maroon;"&gt;(&lt;/span&gt;&lt;span style="color: navy;"&gt;int&lt;/span&gt; argc&lt;span style="color: maroon;"&gt;,&lt;/span&gt; _TCHAR&lt;span style="color: maroon;"&gt;*&lt;/span&gt; argv&lt;span style="color: maroon;"&gt;[])&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; &lt;span style="color: maroon;"&gt;(&lt;/span&gt;Euler1Iterate&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1000&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Euler1Numeric&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;&lt;span style="color: maroon;"&gt;,&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1000&lt;/span&gt;&lt;span style="color: maroon;"&gt;&amp;gt;::&lt;/span&gt;RET&lt;span style="color: maroon;"&gt;)/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;&lt;span style="color: maroon;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: maroon;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Finally, a short word about benchmarks.  The compiled versions (C/C++/C#/Java/F#) all ran a lot faster than the scripting language versions (Lua/Python/Ruby).  That was no surprise.  What was surprising, however, was just how fast the scripted versions were – even given the startup time.  Plenty fast enough for almost anything other than data or numeric intensive programs, and certainly fast enough to handle most user tasks.  Of the three scripting languages, Lua lived up to its reputation as the fastest, but Ruby and Python weren’t far behind (Ruby was slightly faster than Python). &lt;br /&gt;&lt;br /&gt;And that’s it: one problem, three solutions, seven languages.&lt;br /&gt;&lt;br /&gt;-Neil&lt;br /&gt;&lt;br /&gt;p.s.  I apologize for not syntax highlighting several of the samples.  I have a VS2008 add-in that will do it, but I don’t know how to do it in NetBeans.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-1117261950283138025?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/1117261950283138025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=1117261950283138025' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1117261950283138025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1117261950283138025'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/01/one-problem-three-solutions-seven.html' title='Project Euler #1 - One Problem, Three Solutions, Seven Languages'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-1976516756445729144</id><published>2011-01-17T09:32:00.000-08:00</published><updated>2011-01-18T06:11:29.309-08:00</updated><title type='text'>If Programming Languages Were Television Shows</title><content type='html'>I’m working on a more substantial post that compares several programming languages on a single problem.  In the meantime, I give you something frivolous; my take on…&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;If Programming Languages Were Television Shows&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;F#&lt;/strong&gt; – &lt;em&gt;Mythbusters&lt;/em&gt;.  We don't just explain the functional programming myths, we put them to the test.  (Am I missing an eyebrow?)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Haskell&lt;/strong&gt; – The Saturday-afternoon calculus course from the local community college on the public access channel.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Fortran&lt;/strong&gt; – An old movie, a perennial favorite with classic actors, and the credits arranged in a matrix.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java&lt;/strong&gt; – Something on a business channel with a scrolling stock ticker and announcers who wear kakis and blue button-downs.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;C#&lt;/strong&gt; – Just like Java, but with fancier graphics on the stock ticker and announcers who wear power ties.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Python&lt;/strong&gt; – Financial advice for the small investor.  It seems sound, but which way will the market trend?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;C/C++&lt;/strong&gt; – Some PBS hippie show about growing and canning your own vegetables.  Who needs garbage collection when you can compost?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lua&lt;/strong&gt; – A late-night foreign art film in black and white by a visionary director.  Deep, but will it find enough sponsors to go prime time?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ruby&lt;/strong&gt; – &lt;em&gt;Star Trek&lt;/em&gt;.  Geeky, gadgety, and tough on newcomers, but a fiercely loyal fan base will keep this series in syndication for a while.  Beam me up, Matz!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;FORTH&lt;/strong&gt; – &lt;em&gt;The Woodwright’s Shop&lt;/em&gt;.  Watch a guy make handmade furniture using handmade tools.  Be careful of splinters.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Assembly Language&lt;/strong&gt; - A test pattern.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;COBOL&lt;/strong&gt; – Something on the radio your parents or grandparents used to listen to.&lt;br /&gt;&lt;br /&gt;(Sorry, COBOL geeks, I couldn't resist that last one, lol.  We love you anyway.)&lt;br /&gt;&lt;br /&gt;-Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-1976516756445729144?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/1976516756445729144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=1976516756445729144' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1976516756445729144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1976516756445729144'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2011/01/if-programming-languages-were.html' title='If Programming Languages Were Television Shows'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-5762082353613731936</id><published>2010-10-03T07:57:00.000-07:00</published><updated>2010-10-09T07:48:37.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>F# Computation Expressions: Basic Data Retrieval Mechanics</title><content type='html'>One of the uses often mentioned for F# computation expressions is that of simplifying the syntax of database retrieval.  To investigate how the mechanics of this could work, I decided to implement a simple relational retrieval system.  I tried to pare it down to the utmost basics, and I’m happy to say I got further than I expected; the sample problem has far more lines of code than does the computation expression itself!&lt;br /&gt;&lt;br /&gt;The test database itself consists of two record types.  The first is a simple key/value pair.  The second is a linking record type which consists of two keys.  This keeps things simple for the test, but the method would remain the same even for more complex record structures.&lt;br /&gt;&lt;br /&gt;The computation expression doesn’t really do much other than see that work is properly partitioned into the classic collection and decision phases.  Even less work is done by the operators (from,  where, and select), which don’t have any function other than documentation.  My test code uses a simple database of flags and colors, where the tables are implemented as lists.&lt;br /&gt;&lt;br /&gt;Disclaimer: this oversimplified code is designed to illustrate the basic mechanics of this type of workflow.  It is *not* to be considered ideal, practical or canonical!  To solve this type of problem in production code, please use the F# Linq extensions; they are consistent, composable, and standard.  (And as always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;Credit: I think I first saw this idea from a web video, but I can’t recall where  (possibly Channel9?).  If anyone knows and can point me to it, I’ll be happy to revise this post to give credit to the source.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Micro relational database.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// ID,Value table.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Rec &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Key &lt;span style="color: maroon;"&gt;:&lt;/span&gt; int;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Value &lt;span style="color: maroon;"&gt;:&lt;/span&gt; string&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;static&lt;/span&gt; &lt;span style="color: navy;"&gt;member&lt;/span&gt; Make (k,v) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; { Key&lt;span style="color: maroon;"&gt;=&lt;/span&gt;k; Value&lt;span style="color: maroon;"&gt;=&lt;/span&gt;v }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// ID to ID relational link table.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Link &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; KeyFrom &lt;span style="color: maroon;"&gt;:&lt;/span&gt; int;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; KeyTo &lt;span style="color: maroon;"&gt;:&lt;/span&gt; int;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;static&lt;/span&gt; &lt;span style="color: navy;"&gt;member&lt;/span&gt; Make (kf,kt) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; { KeyFrom&lt;span style="color: maroon;"&gt;=&lt;/span&gt;kf; KeyTo&lt;span style="color: maroon;"&gt;=&lt;/span&gt;kt }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Micro query workflow.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Note the austere quality of the functions.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// The real work is done by the collect in&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// the first bind and the decision in the second.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// The workflow just sees to it that things &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// get routed properly.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; MicroQuery () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// This de-sugars the &amp;quot;from&amp;quot; operator.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (s,f) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;collect f s &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// This de-sugars the &amp;quot;where&amp;quot; operator.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (b,f) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;if&lt;/span&gt; b &lt;span style="color: navy;"&gt;then&lt;/span&gt; f() &lt;span style="color: navy;"&gt;else&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;empty &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// This de-sugars the &amp;quot;select&amp;quot; operator.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return v &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;singleton v&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Since all the logic is contained&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// in the workflow, these are not really&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// necessary except as a form of&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// self-documentation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; from s &lt;span style="color: maroon;"&gt;=&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; where b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; select v &lt;span style="color: maroon;"&gt;=&lt;/span&gt; v&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// For test data, I define some countries and&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// the colors of their flags.&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// For consistency, I used the names &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// and spellings used in the USA.)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// If I left out your country, consider it &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// an exercise to the reader to add it!&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; countries &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Australia&amp;quot;&lt;/span&gt;);&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Brazil&amp;quot;&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Germany&amp;quot;&lt;/span&gt;);&amp;nbsp; &amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Italy&amp;quot;&lt;/span&gt;);&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Mexico&amp;quot;&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Netherlands&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;South Africa&amp;quot;&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;7&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Spain&amp;quot;&lt;/span&gt;); (&lt;span style="background: #ffeeea;"&gt;8&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;USA&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map Rec&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Make&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; colors &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Black&amp;quot;&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Gold&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Green&amp;quot;&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;); (&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;,&lt;span style="background: #fcf0d8;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map Rec&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Make &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; flags &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;3&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;6&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;7&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;2&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; (&lt;span style="background: #ffeeea;"&gt;8&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;8&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt;);(&lt;span style="background: #ffeeea;"&gt;8&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;5&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map Link&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Make &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// This query will return the colors of&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// a country's flag.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; flagColors countryIn &lt;span style="color: maroon;"&gt;=&lt;/span&gt; MicroQuery () {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; country &lt;span style="color: maroon;"&gt;=&lt;/span&gt; from countries&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; where country&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value&lt;span style="color: maroon;"&gt;=&lt;/span&gt;countryIn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; flag &lt;span style="color: maroon;"&gt;=&lt;/span&gt; from flags&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; where country&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Key&lt;span style="color: maroon;"&gt;=&lt;/span&gt;flag&lt;span style="color: maroon;"&gt;.&lt;/span&gt;KeyFrom&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; color &lt;span style="color: maroon;"&gt;=&lt;/span&gt; from colors&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; where color&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Key&lt;span style="color: maroon;"&gt;=&lt;/span&gt;flag&lt;span style="color: maroon;"&gt;.&lt;/span&gt;KeyTo&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; select color&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Test it:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; flagColorsBrazil &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; flagColors &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Brazil&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;toList &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-5762082353613731936?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/5762082353613731936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=5762082353613731936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/5762082353613731936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/5762082353613731936'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/10/f-computation-expressions-basic-data.html' title='F# Computation Expressions: Basic Data Retrieval Mechanics'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-6948590746831417528</id><published>2010-10-01T11:45:00.000-07:00</published><updated>2010-10-09T07:48:37.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>More Novice F# Computation Expression Bind/Return Mechanics</title><content type='html'>Today’s post is more F# “beginner” stuff I’m doing to help myself learn to think about workflows (or computation expressions as they are also called).  As I’ve said before, I’ve gotten to the stage where I can usually puzzle out how to make a workflow do what I need it to do.  However, my goal is to internalize the mechanics of workflows to the point where I can proactively recognize situations where they might be useful.&lt;br /&gt;&lt;br /&gt;Paradoxically then, here is a particularly useless example.  It does little more than simply perform a set of serial conversions.  But it does illustrate the Bind/Return calling chain in a way that makes plain the “de-sugaring” mechanics.  So I thought I would post it here.  (As always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Binder () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (v&lt;span style="color: maroon;"&gt;:&lt;/span&gt;int,f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;float) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// v From Caller&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; down &lt;span style="color: maroon;"&gt;=&lt;/span&gt; v&lt;span style="color: maroon;"&gt;.&lt;/span&gt;ToString()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; func &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f down &lt;span style="background: #ddeaee;"&gt;// Calls Bind:1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; up &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (float) func&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; up &lt;span style="background: #ddeaee;"&gt;// To Caller:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (v&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string,f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// v From Bind:0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; down &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (float) v&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; func &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f down &lt;span style="background: #ddeaee;"&gt;// Calls Bind:2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; up &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (float) func&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; up &lt;span style="background: #ddeaee;"&gt;// To Bind:0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (v&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float,f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;byte&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;double) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// v From Bind:1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; down &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (byte) v&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; func &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f down &lt;span style="background: #ddeaee;"&gt;// Calls Bind:3&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; up &lt;span style="color: maroon;"&gt;=&lt;/span&gt; func&lt;span style="color: maroon;"&gt;.&lt;/span&gt;ToString()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; up &lt;span style="background: #ddeaee;"&gt;// To Bind:1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:3&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (v&lt;span style="color: maroon;"&gt;:&lt;/span&gt;byte,f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;byte list&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;int) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// v From Bind:2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; down &lt;span style="color: maroon;"&gt;=&lt;/span&gt; [v;v]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; func &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f down &lt;span style="background: #ddeaee;"&gt;// Calls Return&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; up &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (double) func&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; up &lt;span style="background: #ddeaee;"&gt;// To Bind:2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Return&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return (v&lt;span style="color: maroon;"&gt;:&lt;/span&gt;byte list) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// v From Bind:3&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; up &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (int) (List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;sum v)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; up &lt;span style="background: #ddeaee;"&gt;// To Bind:3&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; f &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Binder () {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;32&lt;/span&gt; &lt;span style="background: #ddeaee;"&gt;// Bind:0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Bind:3&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; x&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Return&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-6948590746831417528?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/6948590746831417528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=6948590746831417528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6948590746831417528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6948590746831417528'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/10/more-novice-f-computation-expression.html' title='More Novice F# Computation Expression Bind/Return Mechanics'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-3916360361245004506</id><published>2010-09-27T12:46:00.000-07:00</published><updated>2010-10-09T07:48:37.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>F# Computation Expressions, Yield/For Mechanics</title><content type='html'>Today’s episode of the ongoing computation expression saga features Yield/YieldFrom and For.  One encounters fewer examples of these than of Bind/Return, though in most respects their operation is every bit as fundamental.&lt;br /&gt;&lt;br /&gt;The code accompanying this post shows the use of these computation expression members in creating a rudimentary list comprehension builder.  Of course, in real life you’ll want to use F#’s far superior built-in list comprehensions.  But playing “how would I implement built-in construct X” is an old tradition in functional languages, so here it is.  (As always, the code and information here are presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;First, although the desired output is a list, the ongoing concatenation is maintained internally as a sequence.  The Run operator does the work of converting the final sequence into a list.  This makes the computation expression class more general, because the internal sequence could easily be converted to an array, .NET generic collection, etc., with a single change or override.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Run a &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; a &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;toList &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Most of the work for the yield operations in the example is done by the Combine operators.  The Yield, YieldFrom, Delay, and Zero members are really just defaults (in fact, Yield and YieldFrom are identical in form).  Three Combine operators cover most cases:&lt;br /&gt;&lt;br /&gt;1) Prepending a yielded item to an ongoing sequence.  This is the basic yield operation.&lt;br /&gt;&lt;br /&gt;2) Combining a two sequences.  This is the yield! operation.&lt;br /&gt;&lt;br /&gt;3) Appending a yielded item with an ongoing sequence.  This makes it possible to avoid calling the Zero operation using a “().”  (Although Zero is supplied in case it is desired.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a,b) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;append (Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;singleton a) b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a,b) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;append a b &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a,b) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;append a (Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;singleton b) &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The For operator just maps the body of the loop onto each item in the “for” sequence.  This is essentially a default behavior for comprehensions.  (An iteration across the “for” sequence might be a more appropriate default for some situations.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;For (s,f) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; s &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map f &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;At last, here is the full code plus an example.  I named the computation expression builder class “SlightComprehension” both in order to reflect its rudimentary nature and to indicate my slight (but improving!) understanding of computation expressions, lol.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Rudimentary list comprehension builder.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; SlightComprehension () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Combine an item and a list.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a,b) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;append (Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;singleton a) b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a,b) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;append a b &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a,b) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;append a (Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;singleton b) &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Map the function and convert&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// the result to a list.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;For (s,f) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; s &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map f &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// The following members are basically defaults.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Delay f &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// The concatenations are maintained&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// internally as a sequence.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// This call converts them to a list&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// on output.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Run a &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; a &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;toList &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// The Combine overload makes &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Yield and YieldFrom identical&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// in form.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Yield a &lt;span style="color: maroon;"&gt;=&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;YieldFrom a &lt;span style="color: maroon;"&gt;=&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Zero() &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;empty &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; result0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; SlightComprehension () {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; i &lt;span style="color: navy;"&gt;in&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;2..3&lt;/span&gt; &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; i &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;4&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// The following calls Zero.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; () }&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; result1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; SlightComprehension () {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield!&lt;/span&gt; result0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; seq { &lt;span style="color: navy;"&gt;for&lt;/span&gt; i &lt;span style="color: navy;"&gt;in&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;5..7&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; i }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;8&lt;/span&gt; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// result1 = [0;1;2;3;4;5;6;7;8]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%A&amp;quot;&lt;/span&gt; result1&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-3916360361245004506?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/3916360361245004506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=3916360361245004506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/3916360361245004506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/3916360361245004506'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/f-computation-expressions-yieldfor.html' title='F# Computation Expressions, Yield/For Mechanics'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-582909334533302579</id><published>2010-09-26T17:50:00.000-07:00</published><updated>2010-10-09T07:48:37.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>F# Computation Expression Bind/Return Mechanics Continued.</title><content type='html'>Isn’t it always the way?  Almost as soon as I posted the previous entry, I came up with an example I like better.  Rather than replace that example, I’ll just post the new one here.  &lt;br /&gt;&lt;br /&gt;This one adds overloads to Bind, which show how both multiple types of let! bindings as well as do! bindings can be produced.  It prints a trace of the calls and returns to the console, illustrating the descend an return behavior.  &lt;br /&gt;&lt;br /&gt;Below are the output and the code.  As always, it is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bg1dOoHV3So/TJ_rdpGVdSI/AAAAAAAAAH0/BubRyWXeiLg/s1600/Image1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 129px;" src="http://1.bp.blogspot.com/_bg1dOoHV3So/TJ_rdpGVdSI/AAAAAAAAAH0/BubRyWXeiLg/s320/Image1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5521390562660676898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Sample do!,let!,return! binder.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Binder () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// For indent to list level.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; spaces spc &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: navy;"&gt;function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | [] &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; spc&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | h&lt;span style="color: maroon;"&gt;::&lt;/span&gt;t &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; spaces (&lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;quot;&lt;/span&gt;&lt;span style="color: maroon;"&gt;+&lt;/span&gt;spc) t&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// let! binding (first use).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string list&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;string list) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Entering let! %s,[]&amp;quot;&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; rtn &lt;span style="color: maroon;"&gt;=&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;tail (f [s])&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%sLeaving let! %s,%A&amp;quot;&lt;/span&gt; (spaces &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; rtn) s rtn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; rtn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// let! binding (nth use).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind ((s,sl)&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string&lt;span style="color: maroon;"&gt;*&lt;/span&gt;(string list),&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string list&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;string list) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%sEntering let! %s,%A&amp;quot;&lt;/span&gt; (spaces &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; sl) s sl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; rtn &lt;span style="color: maroon;"&gt;=&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;tail (f (s&lt;span style="color: maroon;"&gt;::&lt;/span&gt;sl))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%sLeaving let! %s,%A&amp;quot;&lt;/span&gt; (spaces &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; rtn) s rtn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; rtn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// do! binding.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind ((s,sl)&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string&lt;span style="color: maroon;"&gt;*&lt;/span&gt;(string list),&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;unit&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;string list) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%sEntering do! %s,%A&amp;quot;&lt;/span&gt; (spaces &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; sl) s sl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; rtn &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%sLeaving do! %s,%A&amp;quot;&lt;/span&gt; (spaces &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; rtn) s rtn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; rtn&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// return.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return (a&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string list) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%sReturn %A&amp;quot;&lt;/span&gt; (spaces &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; a) a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; result &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Binder () {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;,x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;B0&amp;quot;&lt;/span&gt;,x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;,x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; x }&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;p.s. For the spaces function you could also use something like: &lt;br /&gt;new string(' ',sl.Length*2)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-582909334533302579?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/582909334533302579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=582909334533302579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/582909334533302579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/582909334533302579'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/f-computation-expression-bindreturn.html' title='F# Computation Expression Bind/Return Mechanics Continued.'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bg1dOoHV3So/TJ_rdpGVdSI/AAAAAAAAAH0/BubRyWXeiLg/s72-c/Image1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-4361331596360788847</id><published>2010-09-26T11:50:00.000-07:00</published><updated>2010-10-09T07:48:37.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>F# Computation Expressions, a Simple Bind/Return Mnemonic</title><content type='html'>I’ve gotten to the point where I can usually puzzle out what I need in a computation expression while I’m sitting at the computer.  However, I can still have some trouble visualizing the process when I’m thinking “offline” (e.g. while in line at the grocery store, cleaning the rabbit’s litter pan, etc.).  So I’m trying to come up with some useful patterns that I can keep in my head for such occasions.  &lt;br /&gt;&lt;br /&gt;Below is one I’ve come up with for basic Bind/Return operation.  It’s just a simple computation expression that increments a different column of a base ten number depending on the operation.  What are important to me are the names I came up with for the variables.  I don’t claim that they are either academically correct or that they are the best possible names, but they are ones that make sense to me.&lt;br /&gt;&lt;br /&gt;At the bottom of this post is my pattern.  (As always, it is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;The Bind operation takes two parameters: “rhs” and “theRest.”  “rhs” is the result from evaluating the right hand side of the let! assignment.  In the example below, that’s the return from calling “add1.”  “theRest” represents the remainder of the computation.  As you can see, “rhs” (or in this case “rhs” after having 10 added to it), get passed down the line as an “assignedDownX” to “theRest.”  When that call returns, the result gets “returnedUp.”&lt;br /&gt;&lt;br /&gt;The Return operation takes a single parameter, “assignedDown.”  For example purposes, this has 100 added to it.  The result is then “returnedUp.”&lt;br /&gt;&lt;br /&gt;The computation expression example shows the whole thing put together.&lt;br /&gt;&lt;br /&gt;As I said, the names may not be ideal; they represent a particularly mechanical way of thinking about what is happening.  In a context where more sophisticated computation is taking place, conceptual labels will be more meaningful.  But I generally find it easier to remember the mechanical and work towards the conceptual, rather than vice versa.  Perhaps I’m peculiar in that respect; I couldn’t really say for certain, lol.&lt;br /&gt;&lt;br /&gt;Still, it's amazing how simple Bind/Return looks when sticking to the mechanics in light of the power that can be leveraged by augmenting those basic mechanics.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Add 1.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; add1 i &lt;span style="color: maroon;"&gt;=&lt;/span&gt; i&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Adds a 10 on Bind, &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// or a 100 on Return.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; BindAdd10ReturnAdd100 () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Add 10.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (rhs,theRest) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; assignedDown &lt;span style="color: maroon;"&gt;=&lt;/span&gt; rhs&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; returnedUp &lt;span style="color: maroon;"&gt;=&lt;/span&gt; theRest assignedDown&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; returnedUp&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Add 100.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return assignedDown &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; returnedUp &lt;span style="color: maroon;"&gt;=&lt;/span&gt; assignedDown&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;100&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; returnedUp&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test it out.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; result &lt;span style="color: maroon;"&gt;=&lt;/span&gt; BindAdd10ReturnAdd100() {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; assignedDownA &lt;span style="color: maroon;"&gt;=&lt;/span&gt; add1 &lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; assignedDownB &lt;span style="color: maroon;"&gt;=&lt;/span&gt; add1 assignedDownA&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; assignedDownC &lt;span style="color: maroon;"&gt;=&lt;/span&gt; add1 assignedDownB&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; assignedDownC&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-4361331596360788847?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/4361331596360788847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=4361331596360788847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/4361331596360788847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/4361331596360788847'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/f-computation-expressions-simple.html' title='F# Computation Expressions, a Simple Bind/Return Mnemonic'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-5727149463441670923</id><published>2010-09-17T16:16:00.000-07:00</published><updated>2010-10-09T07:48:37.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>F# Workflow for Building Immutable Trees from Delimited Strings</title><content type='html'>Here is an update on an earlier post: &lt;a href="http://techneilogy.blogspot.com/2010/05/computation-expressions-with-net-data.html"&gt;Computation Expressions with .NET Data Types&lt;/a&gt;.  In that case, I showed how to use computation expressions to build a tree from a character-delimited string.  However, there were two things about it I wanted to correct.  First, my understanding of idiomatic F# has improved; it’s still a long way from perfect, but it has improved.  Second, and more important, I really wanted to create an immutable version, but I lacked the skill with computation expressions at the time of the earlier post.&lt;br /&gt;&lt;br /&gt;This post corrects those flaws and presents an interesting workflow design pattern which I think I’m going to find useful in a number of contexts.  (For example, it can be adapted to trees based on data structures other than lists; even .NET data structures as in the original post.)  &lt;br /&gt;&lt;br /&gt;(As always, presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Splits a string into a list, &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// using char.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; splitter (c&lt;span style="color: maroon;"&gt;:&lt;/span&gt;char) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; ca &lt;span style="color: maroon;"&gt;=&lt;/span&gt; [|c|]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (s&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; s&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Split(ca) &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Array&lt;span style="color: maroon;"&gt;.&lt;/span&gt;toList)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Canonical discriminated union tree.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Tree &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; | Branch &lt;span style="color: navy;"&gt;of&lt;/span&gt; string&lt;span style="color: maroon;"&gt;*&lt;/span&gt;Tree list&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; | Leaf &lt;span style="color: navy;"&gt;of&lt;/span&gt; string&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Computation expression class to&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// split a string into a tree.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; TreeSplitter () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (sa,f) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; s&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Branch(s,f s)) sa&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return sa &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; s&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Leaf(s)) sa&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Split by bar, colon, then dot.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; barColonDot s &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Branch(&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; s, &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; TreeSplitter() {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; splitter &lt;span style="background: #fcf0d8;"&gt;'|'&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let!&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; splitter &lt;span style="background: #fcf0d8;"&gt;':'&lt;/span&gt; x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; splitter &lt;span style="background: #fcf0d8;"&gt;'.'&lt;/span&gt; x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; })&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Test print a tree.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; printo &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; f (spc&lt;span style="color: maroon;"&gt;:&lt;/span&gt;string) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: navy;"&gt;function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | Branch(s,c) &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%s%s&amp;quot;&lt;/span&gt; spc s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;iter (f (spc&lt;span style="color: maroon;"&gt;+&lt;/span&gt;&lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;nbsp; &amp;quot;&lt;/span&gt;)) c&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | Leaf(s) &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%s%s&amp;quot;&lt;/span&gt; spc s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; f &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Run a test.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printo &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (barColonDot &lt;span style="background: #fcf0d8;"&gt;&amp;quot;a0.a1:b0.b1|c0.c1:d0.d1&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-5727149463441670923?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/5727149463441670923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=5727149463441670923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/5727149463441670923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/5727149463441670923'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/f-workflow-for-building-immutable-trees.html' title='F# Workflow for Building Immutable Trees from Delimited Strings'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-4992688808570668542</id><published>2010-09-16T11:59:00.000-07:00</published><updated>2010-10-09T07:48:37.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>F# Async Computation Expressions: A Tiny Model System</title><content type='html'>Continuing my quest to learn computation expressions, I decided to explore from scratch the implementation of basic asynchronous behavior.  This post is the result.  It’s not too fancy, and lacks basic safety, resource management, etc., SO DON’T SIMPLY COPY AND USE IT IN REAL LIFE, but it gets the basic idea across.  For real-world use, browse the Microsoft-supplied F# async classes (Microsoft.FSharp.Control.Async, etc.); you’ll find better stuff there than I could come up with.  My goal here was to temporarily strip away most of the complexity, however necessary it is in real life, to investigate an underlying model.&lt;br /&gt;&lt;br /&gt;My computation class below is just a simple thread spinner.  It starts a thread process and then continues with the computation.  As each bit completes, its caller waits for its own process to join, until the initial call joins and control continues at the module level.  A test function in the form of a simple string printer is supplied.  The screenshot below records a typical run.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bg1dOoHV3So/TJJpNgnsgHI/AAAAAAAAAHs/tLtLwE29_Vs/s1600/Image1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 36px;" src="http://3.bp.blogspot.com/_bg1dOoHV3So/TJJpNgnsgHI/AAAAAAAAAHs/tLtLwE29_Vs/s320/Image1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5517588174297923698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As always: this code and other information is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.  This is especially true in this case!  Multi-threading can be a tricky business, and again I recommend you treat my code here as an oversimplified example, and use the Microsoft.FSharp.Control libraries for real-world use.  &lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Threading&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// A simple thread-runner.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Note: don't use this in real life!&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Write something with better safety,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// resource management, etc., or better yet,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// use the F# supplied Async libraries!&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; OverlySimpleAsync () &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Starts a thread and moves on,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// then waits for a join.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Bind (tp,f) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; t &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Thread(ThreadStart(tp))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Start()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; f()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Join()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Does nothing.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return a &lt;span style="color: maroon;"&gt;=&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Simple test.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// This simple test prints a string&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// parameter a random number of times&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// with a random sleep between.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; r &lt;span style="color: maroon;"&gt;=&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Random()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; testThreadProc a &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; () &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; count &lt;span style="color: maroon;"&gt;=&lt;/span&gt; r&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Next(&lt;span style="background: #ffeeea;"&gt;10&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;20&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; sleep &lt;span style="color: maroon;"&gt;=&lt;/span&gt; r&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Next(&lt;span style="background: #ffeeea;"&gt;10&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;500&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; i&lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt; &lt;span style="color: navy;"&gt;to&lt;/span&gt; count &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; printf &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Thread&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Sleep(sleep))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Spin some threads.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;do&lt;/span&gt; OverlySimpleAsync() {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; testThreadProc &lt;span style="background: #fcf0d8;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; testThreadProc &lt;span style="background: #fcf0d8;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; testThreadProc &lt;span style="background: #fcf0d8;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;do!&lt;/span&gt; testThreadProc &lt;span style="background: #fcf0d8;"&gt;&amp;quot;D&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-4992688808570668542?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/4992688808570668542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=4992688808570668542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/4992688808570668542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/4992688808570668542'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/f-async-computation-expressions-tiny.html' title='F# Async Computation Expressions: A Tiny Model System'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bg1dOoHV3So/TJJpNgnsgHI/AAAAAAAAAHs/tLtLwE29_Vs/s72-c/Image1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-9068649235889726096</id><published>2010-09-13T13:05:00.000-07:00</published><updated>2010-10-09T07:48:37.786-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>Basic F# Computation Expressions Using Yield and Combine</title><content type='html'>I decided to learn a little bit about computation expressions beyond the basic Bind/Return operations.  So I made a goal of learning something about the Yield/Combine operations.  &lt;br /&gt;&lt;br /&gt;To demonstrate these operations, I decided to leave behind the world of tomato pricing and return to the simple animal expert system.  The code below implements a typical “toy” guess-the-animal expert system.  It uses computation expressions and lazy evaluation to implement the query and inference logic.  It’s perhaps a bit of a misuse of the “yield” idiom, but it does demonstrate the basic mechanics in a way that can be compared to examples in earlier posts.&lt;br /&gt;&lt;br /&gt;The operation is simple: Yield, Return, and Delay really don’t do much except propagate values; the real logic is in the Combine function.  It uses the short-circuit feature of the &amp;&amp; and || logic operators to minimize the number of queries when establishing a hypothesis.  Lazy evaluation insures that queries are not repeated.   A couple of utility functions query and conclude, take care of gathering the data and reporting the result.  (Note that pressing the ‘y’ or ‘Y’ key indicates an answer of “yes,” while pressing any other key indicates “no.”)&lt;br /&gt;&lt;br /&gt;I’m not sure I’d want to make this the basis of a “Fifth-Generation” A.I. project, lol, but is does show how a neat little DSL can be built with only a few lines of F# code.  The basic “engine,” the computation expression, takes up only 17 lines of code, including comments and whitespace!  Now that’s a tiny expert system shell if there ever was one…&lt;br /&gt;&lt;br /&gt;Here is the output from a typical session:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bg1dOoHV3So/TI6Fe4BlnXI/AAAAAAAAAHM/b6k3hp7gXog/s1600/Image2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 100px;" src="http://1.bp.blogspot.com/_bg1dOoHV3So/TI6Fe4BlnXI/AAAAAAAAAHM/b6k3hp7gXog/s320/Image2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516493359057050994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And below is the code.  (As always: this code and other information is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Joins values asserted by Yield, using a &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// supplied combining function.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Join (fCombine) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Combine (a&lt;span style="color: maroon;"&gt;:&lt;/span&gt;Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;,b&lt;span style="color: maroon;"&gt;:&lt;/span&gt;unit&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; fCombine a b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Delay (f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;unit&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; f&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Return (a&lt;span style="color: maroon;"&gt;:&lt;/span&gt;Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Yield (a&lt;span style="color: maroon;"&gt;:&lt;/span&gt;Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; a&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Yield (a&lt;span style="color: maroon;"&gt;:&lt;/span&gt;unit&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; a()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Define conjunction and disjunction with short-circuiting.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; conjoin &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Join(&lt;span style="color: navy;"&gt;fun&lt;/span&gt; a b&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Lazy(&lt;span style="color: navy;"&gt;fun&lt;/span&gt;()&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;a&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value&lt;span style="color: maroon;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;b()&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; disjoin &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Join(&lt;span style="color: navy;"&gt;fun&lt;/span&gt; a b&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;Lazy(&lt;span style="color: navy;"&gt;fun&lt;/span&gt;()&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;a&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value&lt;span style="color: maroon;"&gt;||&lt;/span&gt;b()&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Syntax helper to query for a boolean.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; query s &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; () &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printf &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%s &amp;quot;&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; q &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (&lt;span style="background: #fcf0d8;"&gt;&amp;quot;yY&amp;quot;&lt;/span&gt;)&lt;span style="color: maroon;"&gt;.&lt;/span&gt;IndexOf(&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Console&lt;span style="color: maroon;"&gt;.&lt;/span&gt;ReadKey()&lt;span style="color: maroon;"&gt;.&lt;/span&gt;KeyChar)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: maroon;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; q)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Syntax helper to assert a lazy boolean.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; conclude s b &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt; s&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Lazy(&lt;span style="color: navy;"&gt;fun&lt;/span&gt;()&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;b)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Basic facts.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; black &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;(query &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Is the animal all or partly black?&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; orange &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;(query &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Is the animal all or partly orange?&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; white &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;(query &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Is the animal all or partly white?&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; spotted &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;(query &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Is the animal spotted?&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; striped &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Lazy&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;bool&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;(query &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Is the animal striped?&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Intermediate hypotheses.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; blackAndWhite &lt;span style="color: maroon;"&gt;=&lt;/span&gt; conjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; black&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; white&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; blackAndOrange &lt;span style="color: maroon;"&gt;=&lt;/span&gt; conjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; black&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; orange&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Output hypotheses (i.e. animals).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; tiger &lt;span style="color: maroon;"&gt;=&lt;/span&gt; conjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; blackAndOrange&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; striped&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; conclude &lt;span style="background: #fcf0d8;"&gt;&amp;quot;It's a tiger.&amp;quot;&lt;/span&gt; &lt;span style="color: navy;"&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;} &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; zebra &lt;span style="color: maroon;"&gt;=&lt;/span&gt; conjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; blackAndWhite&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; striped&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; conclude &lt;span style="background: #fcf0d8;"&gt;&amp;quot;It's a zebra.&amp;quot;&lt;/span&gt; &lt;span style="color: navy;"&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;} &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; leopard &lt;span style="color: maroon;"&gt;=&lt;/span&gt; conjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; blackAndOrange&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; spotted&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; conclude &lt;span style="background: #fcf0d8;"&gt;&amp;quot;It's a leopard.&amp;quot;&lt;/span&gt; &lt;span style="color: navy;"&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;} &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; dalmation &lt;span style="color: maroon;"&gt;=&lt;/span&gt; conjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; blackAndWhite&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; spotted&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; conclude &lt;span style="background: #fcf0d8;"&gt;&amp;quot;It's a dalmation.&amp;quot;&lt;/span&gt; &lt;span style="color: navy;"&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;} &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Root hypothesis.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; animal &lt;span style="color: maroon;"&gt;=&lt;/span&gt; disjoin {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; tiger&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; zebra&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; leopard&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;yield&lt;/span&gt; dalmation &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;return&lt;/span&gt; conclude &lt;span style="background: #fcf0d8;"&gt;&amp;quot;It must be a sasquatch!&amp;quot;&lt;/span&gt; &lt;span style="color: navy;"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Run the engine.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; isKnownAnimal &lt;span style="color: maroon;"&gt;=&lt;/span&gt; animal()&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Value &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-9068649235889726096?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/9068649235889726096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=9068649235889726096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/9068649235889726096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/9068649235889726096'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/basic-f-computation-expressions-using.html' title='Basic F# Computation Expressions Using Yield and Combine'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bg1dOoHV3So/TI6Fe4BlnXI/AAAAAAAAAHM/b6k3hp7gXog/s72-c/Image2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-1825562044723028595</id><published>2010-09-11T10:51:00.000-07:00</published><updated>2010-10-09T07:48:37.786-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert Systems'/><title type='text'>F# Fuzzy0 Update</title><content type='html'>Just a quick note to say that the &lt;a href="http://techneilogy.blogspot.com/2010/09/fuzzy-logic-f-reference-module-fuzzy0.html"&gt;Fuzzy0 reference code&lt;/a&gt; has been updated.  I added a few comments, a constant output function, and the input modifiers “very” and “somewhat.”  These latter constrict and loosen the slope of fuzzification trapezoids or triangles in a manner similar to that in the following graphic:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_bg1dOoHV3So/TIvCmn12nsI/AAAAAAAAAG8/yfVCxZhB37c/s1600/Image1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_bg1dOoHV3So/TIvCmn12nsI/AAAAAAAAAG8/yfVCxZhB37c/s320/Image1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5515716137430982338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More important in the long run, perhaps, is the reason I haven’t posted all week: I’ve been integrating the F# proof-of-concept code I discussed several months ago into the actual product I was writing it for!  Since the product itself is still at the pre-sales stage, I can’t say much more about it until I clear it with the people who own it, but there it is: my first “real” F# project!&lt;br /&gt;&lt;br /&gt;-Neil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-1825562044723028595?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/1825562044723028595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=1825562044723028595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1825562044723028595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/1825562044723028595'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/f-fuzzy0-update.html' title='F# Fuzzy0 Update'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bg1dOoHV3So/TIvCmn12nsI/AAAAAAAAAG8/yfVCxZhB37c/s72-c/Image1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-6711579656789175583</id><published>2010-09-04T07:32:00.000-07:00</published><updated>2010-10-09T07:48:37.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert Systems'/><title type='text'>Discrete Classification using F# and Fuzzy Logic</title><content type='html'>This post shows the first example based on the F# fuzzy logic reference module Fuzzy0.  I continue with the theme of tomatoes.  The example shows how fuzzy logic can be used to classify items such as tomatoes into discrete categories.&lt;br /&gt;&lt;br /&gt;One of the nice things about the model used in Fuzzy0 is that it is so generic it can be adapted to anything.  The input and fuzzification is simply a function, and the output and defuzzification is just another function.  Several useful examples are included as part of Fuzzy0 both for the input function and the functionality connecting the input to the output, but many others are possible.&lt;br /&gt;&lt;br /&gt;Previous examples have used as output a defuzzification method which produced a single number.  This post shows something different.  The output is a weight for each of several categories.  Rather than combining these weights, they are kept discrete and a category is chosen based on the highest weight.&lt;br /&gt;&lt;br /&gt;In the example below, the input uses the (fast becoming traditional) tomato diameter and color, while the output is a series of categories representing the highest-value use.  The example is small and fairly straightforward, but some things merit pointing out:&lt;br /&gt;&lt;br /&gt;1) The rule set uses “conjoin” to combine multiple input fuzzifications based on the minimum.&lt;br /&gt;&lt;br /&gt;2) The tomato types are given a desirability factor.  This is a dimensionless quantity representing all the things that go into deciding the value of a tomato: market price, cost of production, current supply, etc. &lt;br /&gt;&lt;br /&gt;3) “inConst” is used to produce a constant value of 1.0 for ketchup, since all tomatoes are usable in some processed product such as ketchup.&lt;br /&gt;&lt;br /&gt;4) The color is determined by a simple ratio similar to that you could get from a resistance bridge and a couple of photocells.  Likewise, the size could be estimated using very simple sensor circuitry.&lt;br /&gt;&lt;br /&gt;5) I don’t know a darn thing about the tomato industry.&lt;br /&gt;&lt;br /&gt;If you're like me, one of the first questions that comes up when looking at a fuzzy logic system like this is: "why not do it some traditional way, such as a decision tree or a set of differential equations?"  Here's one reason: with a few minutes of explanation, a domain expert such as a tomato buyer could look at the fuzzy logic rules and understand what is going on well enough to judge their quality and even update them.  Try that with a set of differential equations; even most engineers wouldn't like to spend time doing it that way. &lt;br /&gt;&lt;br /&gt;Without further ado, other than to add that, as always: this is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk, here is the code:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; Fuzzy0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Diameter of the tomato in inches.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; small&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMin &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; medium &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMid &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;3.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;4.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; large&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMax &lt;span style="background: #ffeeea;"&gt;3.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;4.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Color on a scale of green..red.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// If Red,Green are sensor values,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// could be computed by something like:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// color = (Red-Green)/(Red+Green+epsilon)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// (&amp;quot;epsilon&amp;quot; prevents division by zero.)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; green&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMin &lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; yellow &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inTri &lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; red&amp;nbsp; &amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMax&amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Defines a tomato variety.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; variety label desirability&amp;nbsp; certainty &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (label,desirability &lt;span style="color: maroon;"&gt;*&lt;/span&gt;certainty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Rules to classify tomatoes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// I just made these up.&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// In case it's still not obvious &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// by this blog post, I am clueless &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// about tomatoes.&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; tomatoRules &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[medium;green], (variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;canning&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.7&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[large; green], (variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;fryer&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.6&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[small; yellow],(variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;decorative&amp;quot;&lt;/span&gt;&amp;nbsp; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[medium;yellow],(variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;sandwich&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.5&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[small; red],&amp;nbsp;&amp;nbsp; (variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;cherry&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.8&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[medium;red],&amp;nbsp;&amp;nbsp; (variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;salad&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.9&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (conjoin[large; red],&amp;nbsp;&amp;nbsp; (variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;ripe&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.7&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; (inConst(&lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;),&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (variety &lt;span style="background: #fcf0d8;"&gt;&amp;quot;ketchup&amp;quot;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="background: #ffeeea;"&gt;0.1&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; ]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Classify a tomato.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Returns all non-zero assignments.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// In actual use, one might use List.max &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// to return a single value.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; classified &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; fireAll tomatoRules [&lt;span style="background: #ffeeea;"&gt;3.7&lt;/span&gt;;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0.5&lt;/span&gt;] &lt;span style="background: #ddeaee;"&gt;// [diameter;color]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;filter (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (_,c)&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;c&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;sortBy (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (_,c)&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;c)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Output using the values above is as follows.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// (Note: rounding assumes at least two significant&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// digits throughout the process.)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//&amp;nbsp;&amp;nbsp; fryer, 0.3&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//&amp;nbsp;&amp;nbsp; canning, 0.21&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//&amp;nbsp;&amp;nbsp; sandwich, 0.15&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//&amp;nbsp;&amp;nbsp; ketchup, 0.1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;printfn &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Your breakpoint here.&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-6711579656789175583?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/6711579656789175583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=6711579656789175583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6711579656789175583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/6711579656789175583'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/discrete-classification-using-f-and.html' title='Discrete Classification using F# and Fuzzy Logic'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-5133290592802145086</id><published>2010-09-03T07:10:00.000-07:00</published><updated>2010-10-09T07:48:37.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert Systems'/><title type='text'>Fuzzy Logic F# Reference Module: Fuzzy0</title><content type='html'>I want to post some more fuzzy logic examples, but first I want to devote a single post to containing the fuzzy logic core code.  I could have done that using CodePlex or something, but that seemed too grandiose for such a small block of code.  So I’ll place the code here, and if I make changes to it, I’ll post those changes here with a link back from the later blog post where I indicate the changes.&lt;br /&gt;&lt;br /&gt;I’m calling this module “Fuzzy0” in anticipation of doing experiments using other models of fuzzy logic.  As I’ve indicated, the techniques used in this module represent only a tiny fraction of the vast family of techniques in the domain of fuzzy engineering.&lt;br /&gt;&lt;br /&gt;The code below is a cleanup and slight refactoring of the earlier examples.  Of particular note, I have stuck with the paired height function/output function model, but have made it even more general.  This makes it possible to add things like conjunction, disjunction, different defuzzification techniques, etc., by extending the code rather than changing it.&lt;br /&gt;&lt;br /&gt;I’d also like to give a shout out to Alec Zorab, who posted a comment which helped me clean up the earlier code considerably and make it more readable.&lt;br /&gt;&lt;br /&gt;Below is the fuzzy logic reference code for module Fuzzy0.  Tomorrow I’ll post an example of its use that explores some extensions of earlier techniques.   As always, all the code here is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.&lt;br /&gt;&lt;br /&gt;(Note: updated 2010.09.11)&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;module&lt;/span&gt; Fuzzy0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The input functions are trapezoids.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// (One is a triangle: a degenerate trapezoid.)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The precomputations and closures&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// make them look more complicated than&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// they really are.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Infinite to the left.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMin x0 x1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; m &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x0&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m&lt;span style="color: maroon;"&gt;+&lt;/span&gt;b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// In the middle.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Simplification of the original&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// is courtesy of Alex Zorab.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// (Ditto similar functions elsewhere.)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMid x0 x1 x2 x3 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; ml &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; mh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x2&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x3)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bl &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x2&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x2 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x3 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Simplified definition for triangles.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inTri xl xc xh &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; ml &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(xc&lt;span style="color: maroon;"&gt;-&lt;/span&gt;xl)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; mh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(xc&lt;span style="color: maroon;"&gt;-&lt;/span&gt;xh)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bl &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;xc&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;xc&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;function&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;xl &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;xc &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;xh &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Infinite to the right.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMax x0 x1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; m &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;function&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | x &lt;span style="color: navy;"&gt;when&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m&lt;span style="color: maroon;"&gt;+&lt;/span&gt;b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// A constant height (infinite line).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inConst h &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; _&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;h)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Modifier narrows towards the peak.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; very (f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;float) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; y &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; y&lt;span style="color: maroon;"&gt;*&lt;/span&gt;y)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Modifier widens out from the peak.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; somewhat (f&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;float) &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; y &lt;span style="color: maroon;"&gt;=&lt;/span&gt; f x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; sqrt y)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Works like: &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// List.map2 (fun f x-&amp;gt;f x) fl al |&amp;gt; List.map min&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// but short-circuits on 0.0 for efficiency.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; conjoin &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;rec&lt;/span&gt; f acc (fl&lt;span style="color: maroon;"&gt;:&lt;/span&gt;(float&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;float) list) (al&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float list) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; fl &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | [] &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; acc&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | h&lt;span style="color: maroon;"&gt;::&lt;/span&gt;t &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; h al&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Head &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Short circuit.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; | n &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; f (min n acc) t al&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Tail &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; f &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Output as a symmetric triangle.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// This function returns the centroid and area.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; outSym xc dx h &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; xc,dx&lt;span style="color: maroon;"&gt;*&lt;/span&gt;(&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;h)&lt;span style="color: maroon;"&gt;*&lt;/span&gt;h&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Output as a trapzoid.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// This function returns the centroid and area.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Can also be used to create &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// asymmetric triangles.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; outTrap x0 x1 x2 x3 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; x3x0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x3&lt;span style="color: maroon;"&gt;+&lt;/span&gt;x0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; dx1x0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; dx3x2 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x3&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x2&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; dx3x0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; x3&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; h &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; x0n &lt;span style="color: maroon;"&gt;=&lt;/span&gt; h&lt;span style="color: maroon;"&gt;*&lt;/span&gt;dx1x0&lt;span style="color: maroon;"&gt;+&lt;/span&gt;x0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; x2n &lt;span style="color: maroon;"&gt;=&lt;/span&gt; h&lt;span style="color: maroon;"&gt;*&lt;/span&gt;dx3x2&lt;span style="color: maroon;"&gt;+&lt;/span&gt;x2&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; a &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (dx3x0&lt;span style="color: maroon;"&gt;+&lt;/span&gt;x2n&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0n)&lt;span style="color: maroon;"&gt;*&lt;/span&gt;h&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// This is a quick approximation of&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// the centroid.&amp;nbsp; It can skew towards&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// the peak in some cases, which is OK.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; c &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (x3x0&lt;span style="color: maroon;"&gt;+&lt;/span&gt;x0n&lt;span style="color: maroon;"&gt;+&lt;/span&gt;x2n)&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;4.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; c,a )&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Output as a constant centroid &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// and proportional area.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; outConst (c&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float) (a&lt;span style="color: maroon;"&gt;:&lt;/span&gt;float) h &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; c,a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;h&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Some simple, common functions&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// to help clean up the syntax.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Defuzzify by weighted centroid.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Note: will return NaN if all sets have zero area.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// This is by design, since different implementations&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// may mandate different behavior in this situation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; weightedCentroid xl &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;fold (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (cc,aa)(c,a)&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;(cc&lt;span style="color: maroon;"&gt;+&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;c,aa&lt;span style="color: maroon;"&gt;+&lt;/span&gt;a)) (&lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;) xl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;||&amp;gt;&lt;/span&gt; (&lt;span style="color: maroon;"&gt;/&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Maps a scalar onto list of functions.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Useful for multi-output rules.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; mapScalar xl h &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; f&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;f h) xl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Fire a rule 1 to 1.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; fire x (inSet,outSet) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; inSet x &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; outSet&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Fire a ruleset,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// but don't defuzzify the result.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Allows for custom defuzzification.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; fireAll sets x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map (fire x) sets &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Fire and defuzzify a ruleset.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Note: will return NaN if all sets have zero area.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// This is by design, since different implementations&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// may mandate different behavior in this situation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;inline&lt;/span&gt; fireAllDef sets x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; fireAll sets x &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; weightedCentroid &lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-5133290592802145086?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/5133290592802145086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=5133290592802145086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/5133290592802145086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/5133290592802145086'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/09/fuzzy-logic-f-reference-module-fuzzy0.html' title='Fuzzy Logic F# Reference Module: Fuzzy0'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-7058488943969231692</id><published>2010-08-30T06:55:00.000-07:00</published><updated>2010-10-09T07:48:37.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert Systems'/><title type='text'>F#, Fuzzy Logic, WPF, and Tomatoes!</title><content type='html'>This is my 100th blog post, and to celebrate, I’m pulling out all the stops.  This example will combine F#, fuzzy logic, WPF, and tomatoes!&lt;br /&gt;&lt;br /&gt;The example below illustrates a simple fuzzy logic control simulator.  In this case, what’s being controlled is the behavior of graphical tomatoes which “chase” the mouse cursor.  The fuzzy inference system has two inputs: 1) the distance from the tomato to the cursor, and 2) the speed of the cursor.  There is a single output: the speed at which a tomato should chase the cursor.  To make things even more interesting, I’ve simulated tomatoes of three dispositions: timid, cautious, and aggressive.  The green tomato, being green, is the timid one.  The yellow tomato, like the traffic light of the same color, is cautious.  The red tomato, like its active color, is aggressive.&lt;br /&gt;&lt;br /&gt;Below is the application with the window reduced a bit to fit the blog.  In real life, it’s more fun to run it full screen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bg1dOoHV3So/THu4mv1vNEI/AAAAAAAAAGk/q_zFHCPKhRQ/s1600/tomato2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 261px; height: 221px;" src="http://3.bp.blogspot.com/_bg1dOoHV3So/THu4mv1vNEI/AAAAAAAAAGk/q_zFHCPKhRQ/s320/tomato2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5511201544834331714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a WPF application, so it will require a number of additional steps when making it a Visual Studio project:&lt;br /&gt;&lt;br /&gt;1) First, create a new F# project of type console and copy and paste the code below.  (To make things more convenient, I made the entire project, fuzzy logic included, into one big file.  If there are problems with carriage returns and line feeds, try pasting via an intermediate editor such as WordPad.) &lt;br /&gt;&lt;br /&gt;2) Second, under project properties, set the application type to “Windows Application.”&lt;br /&gt;&lt;br /&gt;3) Third, add the appropriate references.  The references for VS2010 and .NET 4.0 are listed in the source code below.  For other versions of Visual Studio and .NET, you can use the time honored trial and error technique of letting the compiler complain about the missing references and then adding them.&lt;br /&gt;&lt;br /&gt;And that’s it!  As always, all the code here is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// I have the following libraries referenced&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// in the solution as 4.0 Client Profile.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// These may vary for other versions of .NET.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Accessibility&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// FSharp.Core&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// mscorlib&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// PresentationCore&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// PresentationFramework&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// System&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// System.Core&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// System.Numerics&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// System.Xaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// UIAutomationTypes&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// WindowsBase&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Windows&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Windows&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Controls&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;open&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Windows&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Media&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Here is the fuzzy logic subsystem.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The input functions are trapezoids.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The precomputations and closures&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// make them look more complicated than&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// they really are.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Technically, since Min and Max are&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// trapezoids with one side at infinity,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// a single function would suffice.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// But three functions are more efficient&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// and comprehensible.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Infinite to the left.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMin x0 x1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; m &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x0&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m&lt;span style="color: maroon;"&gt;+&lt;/span&gt;b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; )&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// In the middle.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMid x0 x1 x2 x3 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; ml &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; mh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x2&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x3)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bl &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x2&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x2 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x3 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; )&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Infinite to the right.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMax x0 x1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; m &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;gt;=&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m&lt;span style="color: maroon;"&gt;+&lt;/span&gt;b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; )&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The output set is a symmetric triangle.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// This function returns the area and centroid.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; outSym xc dx h &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; dx&lt;span style="color: maroon;"&gt;*&lt;/span&gt;(&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;h)&lt;span style="color: maroon;"&gt;*&lt;/span&gt;h,xc&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Fire one rule.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; fire x (inSet,outSet) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; x &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; inSet &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; outSet&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Fire a rule vector.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; fireV xl (inSets,outSet) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map2 (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; f x&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;f x) inSets xl &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; Seq&lt;span style="color: maroon;"&gt;.&lt;/span&gt;min&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; outSet &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Fire and defuzzify a ruleset.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;private&lt;/span&gt; fireAll0 f sets x &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;map (f x) sets &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; List&lt;span style="color: maroon;"&gt;.&lt;/span&gt;fold (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (aa,cc)(a,c)&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;(aa&lt;span style="color: maroon;"&gt;+&lt;/span&gt;a,cc&lt;span style="color: maroon;"&gt;+&lt;/span&gt;a&lt;span style="color: maroon;"&gt;*&lt;/span&gt;c)) (&lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; (aa,cc)&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;cc&lt;span style="color: maroon;"&gt;/&lt;/span&gt;aa)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Scalar fire and defuzzify a ruleset.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; fireAll sets x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; fireAll0 fire sets x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Vector fire and defuzzify a ruleset.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; fireAllV sets x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; fireAll0 fireV sets x&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Helper functions for this ruleset.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; estimate rules distance speed &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (fireAllV rules [distance;speed])&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; estimateXY rules dX sX dY sY &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; estimate rules dX sX,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; estimate rules dY sY&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Here are the rules.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// I got them about 90% of the way&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// on the first shot just by thinking &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// about them, and about 10% by&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// experimentation and tweaking.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// That's the power of fuzzy logic!&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Distance values in WPF units.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; adjacent &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMin &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;4.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; near&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMid &lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;4.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;10.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;80.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; far&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMid &lt;span style="background: #ffeeea;"&gt;10.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;80.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;140.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;200.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; wayOff&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMax &lt;span style="background: #ffeeea;"&gt;140.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;200.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Cursor movement values in WPF units.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; still&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMin &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; medium &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMid &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;10.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;40.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; fast&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; inMax &lt;span style="background: #ffeeea;"&gt;10.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;40.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Tomato movement values in WPF units.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; hold&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; outSym &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; creep &lt;span style="color: maroon;"&gt;=&lt;/span&gt; outSym &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; walk&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; outSym &lt;span style="background: #ffeeea;"&gt;2.5&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; run&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; outSym &lt;span style="background: #ffeeea;"&gt;7.0&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Constant.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; setConst h &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; _&lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;h)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Three basic behaviour types&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// will be illustrated using &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// three &amp;quot;tomatoes&amp;quot; of&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// varying disposition.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; rulesTimid &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([adjacent;still], hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([near;&amp;nbsp; &amp;nbsp; still], creep);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([far;&amp;nbsp; &amp;nbsp;&amp;nbsp; still], walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([wayOff;&amp;nbsp; still], run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([(setConst &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;);medium],creep);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([(setConst &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;);fast],hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; ]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; rulesCautious &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([adjacent;still], hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([near;&amp;nbsp; &amp;nbsp; still], walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([far;&amp;nbsp; &amp;nbsp;&amp;nbsp; still], walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([wayOff;&amp;nbsp; still], run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([adjacent;medium],hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([near;&amp;nbsp; &amp;nbsp; medium],walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([far;&amp;nbsp; &amp;nbsp;&amp;nbsp; medium],walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([wayOff;&amp;nbsp; medium],run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([(setConst &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;);fast],hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; ]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; rulesAggressive &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([adjacent;still], hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([near;&amp;nbsp; &amp;nbsp; still], walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([far;&amp;nbsp; &amp;nbsp;&amp;nbsp; still], run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([wayOff;&amp;nbsp; still], run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([adjacent;medium],hold);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([near;&amp;nbsp; &amp;nbsp; medium],walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([far;&amp;nbsp; &amp;nbsp;&amp;nbsp; medium],walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([wayOff;&amp;nbsp; medium],run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([adjacent;fast],walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([near;&amp;nbsp; &amp;nbsp; fast],walk);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([far;&amp;nbsp; &amp;nbsp;&amp;nbsp; fast],run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; ([wayOff;&amp;nbsp; fast],run);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; ]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Tomato record.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; Tomato&lt;span style="color: maroon;"&gt;&amp;lt;'&lt;/span&gt;Rules&lt;span style="color: maroon;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Shape &lt;span style="color: maroon;"&gt;:&lt;/span&gt; Shapes&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Ellipse; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Rules &lt;span style="color: maroon;"&gt;:&lt;/span&gt; &lt;span style="color: maroon;"&gt;'&lt;/span&gt;Rules;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// These store momentum.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; Mx &lt;span style="color: maroon;"&gt;:&lt;/span&gt; float; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; My &lt;span style="color: maroon;"&gt;:&lt;/span&gt; float; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; makeTomato rules brush &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; shape &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: navy;"&gt;new&lt;/span&gt; Shapes&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Ellipse();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; shape&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Fill &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; brush&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; { &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Shape &lt;span style="color: maroon;"&gt;=&lt;/span&gt; shape; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Rules &lt;span style="color: maroon;"&gt;=&lt;/span&gt; rules;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; Mx &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; My &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Define the tomatoes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// This could also be done in MainWindow;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// I do it here for ease of reading.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; tomatoes &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; makeTomato rulesTimid Brushes&lt;span style="color: maroon;"&gt;.&lt;/span&gt;PaleGreen;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; makeTomato rulesCautious Brushes&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Yellow;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; makeTomato rulesAggressive Brushes&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Tomato;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; ]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Here is the user interface subsystem.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// WPF main window.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; MainWindow (app&lt;span style="color: maroon;"&gt;:&lt;/span&gt; Application) &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;inherit&lt;/span&gt; Window()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; canvas &lt;span style="color: maroon;"&gt;=&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Windows&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Controls&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Canvas() &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Momentum factor.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Lower = more dampening.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// This can be fun to play with.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&amp;lt;Literal&amp;gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; momentum &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.7&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&amp;lt;Literal&amp;gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; tomatoRadiusX &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;10.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; [&amp;lt;Literal&amp;gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; tomatoRadiusY &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;10.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; tomatoTargetLeft &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; tomatoTargetTop &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; tomatoTargetLeft0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; &lt;span style="color: navy;"&gt;mutable&lt;/span&gt; tomatoTargetTop0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// This timer handles tomato movement.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; timer &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;new&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Windows&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Threading&lt;span style="color: maroon;"&gt;.&lt;/span&gt;DispatcherTimer()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Tomato movement timer callback.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; moveTomato e &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Target speed.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; sX &lt;span style="color: maroon;"&gt;=&lt;/span&gt; tomatoTargetLeft&lt;span style="color: maroon;"&gt;-&lt;/span&gt;tomatoTargetLeft0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; sY &lt;span style="color: maroon;"&gt;=&lt;/span&gt; tomatoTargetTop&lt;span style="color: maroon;"&gt;-&lt;/span&gt;tomatoTargetTop0&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Cache current target.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetLeft0 &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; tomatoTargetLeft&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetTop0 &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; tomatoTargetTop&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; t &lt;span style="color: navy;"&gt;in&lt;/span&gt; tomatoes &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Tomato position.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; tX &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;GetLeft t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; tY &lt;span style="color: maroon;"&gt;=&lt;/span&gt; Canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;GetTop t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Distance to target.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; dX &lt;span style="color: maroon;"&gt;=&lt;/span&gt; tX&lt;span style="color: maroon;"&gt;-&lt;/span&gt;tomatoTargetLeft&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; dY &lt;span style="color: maroon;"&gt;=&lt;/span&gt; tY&lt;span style="color: maroon;"&gt;-&lt;/span&gt;tomatoTargetTop&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Estimate absolute delta x,y.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; x &lt;span style="color: maroon;"&gt;=&lt;/span&gt; estimate t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Rules (abs(dX))(abs(sX))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; y &lt;span style="color: maroon;"&gt;=&lt;/span&gt; estimate t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Rules (abs(dY))(abs(sY))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Restore the sign.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; x0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (float (sign(dX)))&lt;span style="color: maroon;"&gt;*&lt;/span&gt;x&lt;span style="color: maroon;"&gt;+&lt;/span&gt;t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Mx&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; y0 &lt;span style="color: maroon;"&gt;=&lt;/span&gt; (float (sign(dY)))&lt;span style="color: maroon;"&gt;*&lt;/span&gt;y&lt;span style="color: maroon;"&gt;+&lt;/span&gt;t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;My&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Cache the new momentum.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Mx &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; x0&lt;span style="color: maroon;"&gt;*&lt;/span&gt;momentum&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;My &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; y0&lt;span style="color: maroon;"&gt;*&lt;/span&gt;momentum&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Move the tomato.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;SetLeft(t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape,tX&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0) &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;SetTop(t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape,tY&lt;span style="color: maroon;"&gt;-&lt;/span&gt;y0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Mouse move callback.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; onMouseMove (e&lt;span style="color: maroon;"&gt;:&lt;/span&gt;Input&lt;span style="color: maroon;"&gt;.&lt;/span&gt;MouseEventArgs)&amp;nbsp; &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; p &lt;span style="color: maroon;"&gt;=&lt;/span&gt; e&lt;span style="color: maroon;"&gt;.&lt;/span&gt;GetPosition(canvas) &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Mouse position is the target&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// for the tomato center.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetLeft &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; p&lt;span style="color: maroon;"&gt;.&lt;/span&gt;X&lt;span style="color: maroon;"&gt;-&lt;/span&gt;tomatoRadiusX &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetTop &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; p&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Y&lt;span style="color: maroon;"&gt;-&lt;/span&gt;tomatoRadiusY &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="background: #ddeaee;"&gt;/// Initialize all and sundry.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;member&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Initialize () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Window setup.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Title &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="background: #fcf0d8;"&gt;&amp;quot;Fuzzy Tracker Tomatoes&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Width &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;400.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Height &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Width&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Tomato setup.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetLeft &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Width&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetTop &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Height&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetLeft0 &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; tomatoTargetLeft&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; tomatoTargetTop0 &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; tomatoTargetTop&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;for&lt;/span&gt; t &lt;span style="color: navy;"&gt;in&lt;/span&gt; tomatoes &lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Width &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; tomatoRadiusX&lt;span style="color: maroon;"&gt;*&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Height &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; tomatoRadiusY&lt;span style="color: maroon;"&gt;*&lt;/span&gt;&lt;span style="background: #ffeeea;"&gt;2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;SetLeft(t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape,tomatoTargetLeft)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;SetTop(t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape,tomatoTargetTop)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Children&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Add t&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Shape &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; ignore&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Canvas setup.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; canvas&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Background &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; Brushes&lt;span style="color: maroon;"&gt;.&lt;/span&gt;SlateGray&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;AddChild canvas&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="background: #ddeaee;"&gt;// Start interaction.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; this&lt;span style="color: maroon;"&gt;.&lt;/span&gt;MouseMove&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Add onMouseMove&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; timer&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Tick&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Add moveTomato&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; timer&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Interval &lt;span style="color: maroon;"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color: navy;"&gt;new&lt;/span&gt; System&lt;span style="color: maroon;"&gt;.&lt;/span&gt;TimeSpan(&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;0&lt;/span&gt;,&lt;span style="background: #ffeeea;"&gt;50&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; timer&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Start()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// WPF application.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;type&lt;/span&gt; App () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;inherit&lt;/span&gt; Application()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;static&lt;/span&gt; &lt;span style="color: navy;"&gt;member&lt;/span&gt; Go () &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; app &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: navy;"&gt;new&lt;/span&gt; App()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; win &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="color: navy;"&gt;new&lt;/span&gt; MainWindow(app)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; win&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Initialize()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; app&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Run(win) &lt;span style="color: maroon;"&gt;|&amp;gt;&lt;/span&gt; ignore&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Main entry point.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;/// Runs the application.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;[&amp;lt;STAThread&amp;gt;] &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; App&lt;span style="color: maroon;"&gt;.&lt;/span&gt;Go()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8980149464912824496-7058488943969231692?l=techneilogy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techneilogy.blogspot.com/feeds/7058488943969231692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8980149464912824496&amp;postID=7058488943969231692' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/7058488943969231692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8980149464912824496/posts/default/7058488943969231692'/><link rel='alternate' type='text/html' href='http://techneilogy.blogspot.com/2010/08/f-fuzzy-logic-wpf-and-tomatoes.html' title='F#, Fuzzy Logic, WPF, and Tomatoes!'/><author><name>TechNeilogy</name><uri>http://www.blogger.com/profile/06377881138289568562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_bg1dOoHV3So/StfeJFmsUAI/AAAAAAAAABU/kgoqEqWZt2k/S220/e7.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bg1dOoHV3So/THu4mv1vNEI/AAAAAAAAAGk/q_zFHCPKhRQ/s72-c/tomato2.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8980149464912824496.post-4385241384544322901</id><published>2010-08-28T07:17:00.000-07:00</published><updated>2010-10-09T07:48:37.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='fsharp'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert Systems'/><title type='text'>Conjunctive Fuzzy Logic Rules in F#</title><content type='html'>Today’s installment is just a small change from yesterday’s.  It shows how to make multipart conjunctive rules by storing the input sets in a list and using the “min” operator to combine the results into a truncation height.  To do this, it adds vector versions of the fire and fire all functions.&lt;br /&gt;&lt;br /&gt;As a test, I continue the tomato theme, this time adding a second set of fuzzy sets to indicate whether the tomatoes are green or red.  Green tomatoes, in Neil’s tomato world, are generally only held to be superior to red tomatoes when they are small frying tomatoes.  I ran some test numbers, and the graph is shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bg1dOoHV3So/THka4HhPSqI/AAAAAAAAAGc/munYrCxEyq4/s1600/t2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://3.bp.blogspot.com/_bg1dOoHV3So/THka4HhPSqI/AAAAAAAAAGc/munYrCxEyq4/s320/t2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5510465170457971362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So what good is this?  Would anyone ever build such a system?  Probably not; I’m sure there are better ways to sort tomatoes.  But it illustrates one of the general classes of problems for which fuzzy logic is appropriate.  So just for fun, let’s imagine how one might us such a system in the real world:&lt;br /&gt;&lt;br /&gt;Neil is a tomato buyer for a local food co-op.  He buys tomatoes from a large number of small growers, all of whom produce crops of mixed tomatoes, which are harvested sporadically throughout the growing season.  The problem is: how to make sure each buyer gets a fair proportion of the return without increasing the overhead too much?  Neil notices a bunch of spare parts in his workshop that may help.  Using these, he quickly rigs up a small, simple conveyor system – small enough to fit on a pickup truck – for grading the tomatoes.  Each tomato rolls over a thin window in the conveyor, where the diminution of light is used to estimate the size of the tomato.  It also rolls past two phototransistors, one with a green filter and one with a red, which estimate its color.  This information is fed to Neil’s laptop, where the fuzzy logic system defined below is used to estimate the value of the crop.  Since the rules are so simple, every couple of weeks, based on discussions with the co-op, the fuzzy logic rules are adjusted to account for the current price of tomatoes.  So there it is: all that tomato wisdom, distilled by fuzzy logic into a ketchup of happy farmers, grocers, and customers!&lt;br /&gt;&lt;br /&gt;And below is the code.  (As always, all the code here is presented "as-is" and without warranty or implied fitness of any kind; use at your own risk.) &lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; line-height: 120%;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;module&lt;/span&gt; Fuzzy&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The input functions are trapezoids.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// The precomputations and closures&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// make them look more complicated than&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// they really are.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Technically, since Min and Max are&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// trapezoids with one side at infinity,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// a single function would suffice.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// But three functions are more efficient&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// and comprehensible.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Infinite to the left.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMin x0 x1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; m &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x0&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m&lt;span style="color: maroon;"&gt;+&lt;/span&gt;b&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; )&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// In the middle.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMid x0 x1 x2 x3 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; ml &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; mh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x2&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x3)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bl &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; bh &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x2&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;x0 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;&lt;/span&gt;x1 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;ml&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bl&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x2 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: maroon;"&gt;&amp;lt;=&lt;/span&gt;x3 &lt;span style="color: navy;"&gt;with&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;span style="color: navy;"&gt;true&lt;/span&gt; &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; x&lt;span style="color: maroon;"&gt;*&lt;/span&gt;mh&lt;span style="color: maroon;"&gt;+&lt;/span&gt;bh&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; | _ &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;0.0&lt;/span&gt; )&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="background: #ddeaee;"&gt;// Infinite to the right.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: navy;"&gt;let&lt;/span&gt; inMax x0 x1 &lt;span style="color: maroon;"&gt;=&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; m &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;(x1&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: navy;"&gt;let&lt;/span&gt; b &lt;span style="color: maroon;"&gt;=&lt;/span&gt; &lt;span style="background: #ffeeea;"&gt;1.0&lt;/span&gt;&lt;span style="color: maroon;"&gt;-&lt;/span&gt;x1&lt;span style="color: maroon;"&gt;*&lt;/span&gt;m &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; (&lt;span style="color: navy;"&gt;fun&lt;/span&gt; x &lt;span style="color: navy;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: navy;"&gt;match&lt;/span&gt; x&lt;span style="color: m
