tag:blogger.com,1999:blog-34590377356482032182024-02-21T01:57:53.314+00:00F# CodeUseful snippets of F# code, formatted in a way that makes it easy to copy and paste the snippet in the F# Interactive editor.holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.comBlogger46125tag:blogger.com,1999:blog-3459037735648203218.post-4145452110185681082013-05-22T22:54:00.001+01:002013-05-22T23:00:54.055+01:00Zipper Forests ( from Haskell )<br />
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> 'a Tree = { rootLabel:'a<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> subForest:'a Forest }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">and</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> 'a Forest = 'a Tree list<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> 'a TreeLoc = { tree : 'a Tree<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts : 'a Forest<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights : 'a Forest<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents : ('a Forest * 'a *
'a Forest) list }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
create_node : 'a -> 'a Tree</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> create_node x = { rootLabel = x<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> subForest = [] }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
maybe : 'a -> ('b -> 'a) -> 'b option -> 'a</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> maybe n f m = </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> m </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | None </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> n<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | Some x </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> f x<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
combChildren : 'a list -> 'a -> 'a list -> 'a list</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> combChildren ls t rs = List.fold (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">fun</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> xs x </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> x::xs) (t::rs) ls<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
downParents : 'a TreeLoc -> ('a Forest * 'a * 'a Forest) list</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> downParents loc = (loc.lefts, (loc.tree).rootLabel,
loc.rights) :: loc.parents<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
splitChildren : 'a list -> 'a list -> int -> ('a list * 'a list)
option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">rec</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> splitChildren acc xs n = <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> (acc, xs, n) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | (acc, xs, 0) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some (acc, xs)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | (acc, x::xs, n) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> splitChildren (x::acc) xs (n
- 1)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | _ </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
parent : 'a TreeLoc -> 'a TreeLoc option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parent loc = </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> loc.parents </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | (pls, v, prs) :: ps </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some { tree = {
rootLabel = v<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
subForest = (combChildren (loc.lefts) (loc.tree) (loc.rights)) }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts = pls<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights = prs<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents = ps }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | [] </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
root : 'a TreeLoc -> 'a TreeLoc </span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">rec</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> root loc = maybe loc root (parent loc)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
left : 'a TreeLoc -> 'a TreeLoc option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> left loc = </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> loc.lefts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | t::ts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts = ts<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights =
loc.tree :: loc.rights }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | [] </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
right : 'a TreeLoc -> 'a TreeLoc option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> right loc = </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> loc.rights </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | t::ts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts =
loc.tree :: loc.lefts<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights = ts }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | [] </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
firstChild : 'a TreeLoc -> 'a TreeLoc option </span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> firstChild loc = </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> (loc.tree).subForest </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | t::ts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some { tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts = []<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights =
ts<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents
= downParents loc }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | [] </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
lastChild : 'a TreeLoc -> 'a TreeLoc option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lastChild loc = </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> (List.rev ((loc.tree).subForest)) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | t::ts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some { tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts =
ts<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights =
[]<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents =
downParents loc }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | [] </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
getChild : int -> 'a TreeLoc -> 'a TreeLoc option </span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> getChild n loc = <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> splitChildren [] ((loc.tree).subForest)
n<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> |> Option.map (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">fun</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> (t::ls, rs) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> { tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
lefts = ls<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
rights = rs<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
parents = downParents loc })<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
findChild : ('a Tree -> bool) -> 'a TreeLoc -> 'a TreeLoc option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> findChild p loc =<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">rec</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> split acc xs = <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> xs </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | x::xs </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">when</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> p x </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some(acc, x, xs)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | x::xs </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> split (x::acc) xs <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | []</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> split [] ((loc.tree).subForest)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> |> Option.map (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">fun</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> (ls, t, rs) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> { tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
lefts = ls<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
rights = rs<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
parents = downParents loc })<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
fromTree : 'a Tree -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> fromTree t = { tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts = []<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights = []<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents = [] }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
fromForest : 'a Forest -> 'a TreeLoc option </span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> fromForest (ts : 'a Forest) = <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">match</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> ts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | t::ts </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> Some { tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts = []<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights = ts<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents = [] }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> | [] </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> None<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
toTree : 'a TreeLoc -> 'a Tree</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> toTree loc = (root loc).tree<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
toForest : 'a TreeLoc -> 'a Forest </span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> toForest loc : 'a Forest = <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> r = root loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> combChildren (r.lefts) (r.tree) (r.rights) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
isRoot : 'a TreeLoc -> bool</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> isRoot loc = List.isEmpty (loc.parents) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
isFirst : 'a TreeLoc -> bool</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> isFirst loc = List.isEmpty (loc.lefts)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
isLast : 'a TreeLoc -> bool</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> isLast loc = List.isEmpty (loc.rights)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
isLeaf : 'a TreeLoc -> bool</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> isLeaf loc = List.isEmpty ((loc.tree).subForest)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
isChild : 'a TreeLoc -> bool</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> isChild loc = not (isRoot loc)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
hasChildren : 'a TreeLoc -> bool</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> hasChildren loc = not (isLeaf loc)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
setTree : 'a Tree -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> setTree t loc = { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
modifyTree : ('a Tree -> 'a Tree) -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> modifyTree f loc = setTree (f (loc.tree)) loc<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
setLabel : 'a -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> setLabel v loc = modifyTree (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">fun</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> t </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> { t </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rootLabel = v }) loc<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
getLabel : 'a TreeLoc -> 'a</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> getLabel loc = (loc.tree).rootLabel<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
modifyLabel : ('a -> 'a) -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> modifyLabel f loc = setLabel (f (getLabel loc)) loc<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
insertLeft : 'a Tree -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> insertLeft t loc = { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights =
loc.tree :: loc.rights }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
insertRight : 'a Tree -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> insertRight t loc = { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts =
loc.tree :: loc.lefts }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
insertDownFirst : 'a Tree -> 'a TreeLoc -> 'a TreeLoc</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> insertDownFirst t loc = { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts =
[]<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights =
(loc.tree).subForest<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents = downParents loc }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
insertDownLast : 'a Tree -> 'a TreeLoc -> 'a TreeLoc </span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> insertDownLast t loc = { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> lefts =
List.rev ((loc.tree).subForest)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> rights =
[]<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> parents =
downParents loc }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//
insertDownAt : int -> 'a Tree -> 'a TreeLoc -> 'a TreeLoc option</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">let</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> insertDownAt n t loc = <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> splitChildren [] ((loc.tree).subForest)
n<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> |> Option.map (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">fun</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> (ls, rs) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">-></span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> { loc </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">with</span><span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;"> tree = t<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
lefts = ls<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt;">
rights = rs<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 9.5pt; line-height: 115%;">
parents = downParents loc })</span><o:p></o:p></div>
holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com1tag:blogger.com,1999:blog-3459037735648203218.post-61872562959246557822013-01-24T23:30:00.001+00:002013-01-24T23:40:38.588+00:00Rx Live Morse Code Translation<br />
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Threading<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Threading</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Tasks<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Reactive</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Linq<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Reactive</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Threading<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Reactive</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Concurrency<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">open</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> System</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Reactive</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Subjects<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">module</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> observeOn
(scheduler</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IScheduler) (xs</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">a</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">ObserveOn(xs, scheduler)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> subscribeOn
(scheduler</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IScheduler) (xs</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">a</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">SubscribeOn(xs, scheduler)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> window (f</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Unit </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">b</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) (xs</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">a</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Window(xs, </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Func</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">b</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">>></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">(f))<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> subscribe' f g (xs</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">a</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
ObservableExtensions</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Subscribe(xs, </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Action</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">a</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">(f), </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Action(g))<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> splitBy separator (xs</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IObservable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">a</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
xs </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">window (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">fun</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> () </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> xs </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">filter (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">fun</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> x </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> x </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> separator))<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">map (Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">filter (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">fun</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> y </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> y </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> separator)) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">type</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> MorseCode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Node </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">of</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> string </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">*</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> MorseCode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">*</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> MorseCode<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | Leaf </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">of</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> string <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | Empty<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> morseCodeTree </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> zeroNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"0"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> nineNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"9"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> dashNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">""</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, zeroNode, nineNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> nullLeaf </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Empty<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> eightNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"8"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> dotNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">""</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, nullLeaf, eightNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> oNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"O"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, dashNode, dotNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> qNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"Q"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, nullLeaf, nullLeaf)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> sevenNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"7"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> zNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"Z"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, nullLeaf, sevenNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> gNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"G"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, qNode, zNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> mNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"M"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, oNode, gNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> yNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"Y"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> cNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"C"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> kNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"K"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, yNode, cNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> xNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"X"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> sixNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"6"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> bNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"B"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, nullLeaf, sixNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> dNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"D"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, xNode, bNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> nNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"N"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, kNode, dNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> tNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"T"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, mNode, nNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> oneNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"1"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> jNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"J"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, oneNode, nullLeaf)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> pNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"P"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> wNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"W"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, jNode, pNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> lNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"L"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> rNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"R"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, nullLeaf, lNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> aNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"A"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, wNode, rNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> twoNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"2"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> udNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">""</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, twoNode, nullLeaf)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> fNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"F"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> uNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"U"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, udNode, fNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> threeNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"3"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> vNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"V"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, threeNode, nullLeaf)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> fourNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"4"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> fiveNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Leaf(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"5"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> hNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"H"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, fourNode, fiveNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> sNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"S"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, vNode, hNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> iNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"I"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, uNode, sNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> eNode </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">"E"</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, aNode, iNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Node(</span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">""</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, tNode, eNode)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> extractChar n </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">match</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> n </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">with</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | Node (ch, _, _) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> ch<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | Leaf ch </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> ch<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | Empty </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">""</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> processChar acc ch </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">match</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> (ch, acc) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">with</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | </span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">'-'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, Node (_, dash, _) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> dash<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | </span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">'.'</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">, Node (_, _, dot) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> dot<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> | _ </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Empty<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> translateMorseCode xs </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> xs </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> splitBy </span><span style="color: #ec7600; font-family: Consolas; font-size: 9.5pt;">' '</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">map(Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">scan processChar
morseCodeTree </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">>></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">map extractChar)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> processKeyPress(subject</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">ISubject</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">char</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">mutable</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> info</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">ConsoleKeyInfo
option </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> None <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">while</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> (info</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">IsNone </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">||</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> info</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Value</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Key </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> ConsoleKey</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Enter) </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">do</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> info </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><-</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Some (Console</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">ReadKey())<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> subject</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">OnNext info</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Value</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">KeyChar <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Environment</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Exit(</span><span style="color: #ffcd22; font-family: Consolas; font-size: 9.5pt;">0</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> getKeyPresses </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> subject </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">new</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Subject</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">char</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">()<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Task</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Run(</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">fun</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> () </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> processKeyPress(subject)) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> ignore<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> subject </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">observeOn(CurrentThreadScheduler</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Instance)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">mutable</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> index </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #ffcd22; font-family: Consolas; font-size: 9.5pt;">0</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> writeCode (x</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">:</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">string) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">let</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> oldpos </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">=</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Console</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">CursorLeft<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Console</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">SetCursorPosition (index, </span><span style="color: #ffcd22; font-family: Consolas; font-size: 9.5pt;">1</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Console</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Write x<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">
Console</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">SetCursorPosition (oldpos, </span><span style="color: #ffcd22; font-family: Consolas; font-size: 9.5pt;">0</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">getKeyPresses </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> translateMorseCode<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">subscribe(Observable</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">subscribe'
writeCode (</span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">fun</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> () </span><span style="color: #93c763; font-family: Consolas; font-size: 9.5pt;">-></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> index </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;"><-</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> index </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">+</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #ffcd22; font-family: Consolas; font-size: 9.5pt;">1</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">) </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">>></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> ignore) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">|></span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> ignore<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Thread</span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">.</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;">Sleep </span><span style="color: #e8e2b7; font-family: Consolas; font-size: 9.5pt;">-</span><span style="color: #ffcd22; font-family: Consolas; font-size: 9.5pt;">1</span><span style="color: #f1f2f3; font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<br />
<iobservable b=""><char><!-----><!-----></char></iobservable>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-81164389991607785732011-08-28T21:34:00.001+01:002011-08-28T21:38:19.991+01:00Functional IoC Container Example<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System</span><br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> StateMonad() =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.ReturnFrom x = x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Return x s = (x, s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Bind (m, f) s = <span style="color: #00aaff;">let</span> (x, s1) = m s <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">in</span> (f x) s1<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> state = <span style="color: #00aaff;">new</span> StateMonad()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> IEnvironment = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">abstract</span> <span style="color: #00aaff;">member</span> UserName : string <span style="color: #00aaff;">with</span> get<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> ILogger = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">abstract</span> <span style="color: #00aaff;">member</span> Log : string <span style="color: #00aaff;">-></span> unit<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Container = { Environment : IEnvironment<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Logger : ILogger }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> getContainer = <span style="color: #00aaff;">fun</span> f <span style="color: #00aaff;">-></span> (f(), f)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> run ctx m = m (<span style="color: #00aaff;">fun</span> () <span style="color: #00aaff;">-></span> ctx) |> fst<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> fac n acc = state { <span style="color: #00aaff;">let!</span> container = getContainer<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> container.Logger.Log (sprintf <span style="color: red;">"%d"</span> acc)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">if</span> (n = 0) <span style="color: #00aaff;">then</span> <span style="color: #00aaff;">return</span> acc<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">else</span> <span style="color: #00aaff;">return!</span> fac (n - 1) (n * acc) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> compute n = state { <span style="color: #00aaff;">let!</span> container = getContainer <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> container.Logger.Log (sprintf <span style="color: red;">"Begin fac %d"</span> n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let!</span> result = fac n 1 <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> container.Logger.Log (sprintf <span style="color: red;">"End fac %d"</span> n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> userName = container.Environment.UserName<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> container.Logger.Log (sprintf <span style="color: red;">"Computed by %s"</span> userName)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> result }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> prodContainer = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> { Environment = { <span style="color: #00aaff;">new</span> IEnvironment <span style="color: #00aaff;">with</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.UserName <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">with</span> get () = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Environment.UserName } <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Logger = { <span style="color: #00aaff;">new</span> ILogger <span style="color: #00aaff;">with</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Log s = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Console.WriteLine (<span style="color: red;">"{0} : {1}"</span>, (DateTime.Now), s) } }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> testContainer = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> { Environment = { <span style="color: #00aaff;">new</span> IEnvironment <span style="color: #00aaff;">with</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.UserName <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">with</span> get () = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: red;">"John Doe"</span> } <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Logger = { <span style="color: #00aaff;">new</span> ILogger <span style="color: #00aaff;">with</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Log s = Console.WriteLine (<span style="color: red;">" {0} "</span>, s) } }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">printfn <span style="color: red;">"Result %A"</span> (run prodContainer (compute 10))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">printfn <span style="color: red;">"Result %A"</span> (run testContainer (compute 10))<o:p></o:p></span></div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-31925050659471647202011-07-17T17:28:00.002+01:002011-07-19T00:09:16.764+01:00Functional WPF Part Five (Simple example of how to use it)<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: 13px;">// Example using the Functional WPF DSL</span><br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// View Model</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Person (firstName, lastName, age) =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">static</span> <span style="color: #00aaff;">member</span> New (firstName, lastName, age) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">new</span> Person(firstName, lastName, age)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.LastName <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">with</span> get () = lastName<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">and</span> set (value : string) = ()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.FirstName <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">with</span> get () = firstName<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">and</span> set (value : string) = ()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Age <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">with</span> get () = age<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">and</span> set (value : int) = ()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> dataContext = [(<span style="color: red;">"Homer"</span>, <span style="color: red;">"Simpson"</span>, 46)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (<span style="color: red;">"Marge"</span>, <span style="color: red;">"Simpson"</span>, 42)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (<span style="color: red;">"Lisa"</span>, <span style="color: red;">"Simpson"</span>, 9)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (<span style="color: red;">"Bart"</span>, <span style="color: red;">"Simpson"</span>, 12) ] |> List.map (Person.New)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Header</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> header = [ label [width 100] <span style="color: red;">"First Name"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> label [width 100] <span style="color: red;">"Last Name"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> label [width 50] <span style="color: red;">"Age"</span> ] |> stackpanel [] Horizontal<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Row</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> row = [ textbox [width 100] <@@ <span style="color: #00aaff;">fun</span> (x:Person) <span style="color: #00aaff;">-></span> x.FirstName @@><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> textbox [width 100] <@@ <span style="color: #00aaff;">fun</span> (x:Person) <span style="color: #00aaff;">-></span> x.LastName @@><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> textbox [width 50] <@@ <span style="color: #00aaff;">fun</span> (x:Person) <span style="color: #00aaff;">-></span> x.Age @@> ] <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> |> stackpanel [] Horizontal<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Data Template</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> sampleTemplate = datatemplate row<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Final composition</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> sampleGrid = [ header<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> itemscontrol sampleTemplate<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> button <span style="color: red;">"submit"</span> ] |> stackpanel [width 250] Vertical<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> |> border Blue<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Main Window</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> mainWindow = window [width 400; height 200] sampleGrid<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Application </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> sampleApplication = application mainWindow<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Run the app with the given dataContext </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">[<STAThread()>]<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">do</span><span style="font-family: Consolas; font-size: 9.5pt;"> run sampleApplication dataContext<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com1tag:blogger.com,1999:blog-3459037735648203218.post-44972493425831466592011-07-17T17:22:00.001+01:002011-07-17T17:23:07.908+01:00Functional WPF Part Four<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: 13px;">// Functional WPF Part Four</span><span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: 13px;"> </span><br />
<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: 13px;">// Running the WPF Application</span><br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">#if</span><span style="font-family: Consolas; font-size: 9.5pt;"> INTERACTIVE<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span class="Apple-style-span" style="color: cyan;"><span style="font-family: Consolas; font-size: 9.5pt;">#r @"WindowsBase.dll"</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span class="Apple-style-span" style="color: cyan;"><span style="font-family: Consolas; font-size: 9.5pt;">#r @"PresentationCore.dll"</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: cyan; font-family: Consolas; font-size: 9.5pt;">#r @"PresentationFramework.dll"</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">#endif</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Windows<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Windows.Controls<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Windows.Markup<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> run app data = app |> parseApplication <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> |> XamlReader.Parse<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> |> <span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> (x :?> System.Windows.Application)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> |> <span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> x.MainWindow.DataContext <- data<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> x.MainWindow.Show()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> x.Run()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> |> ignore<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-34203388123494277912011-07-17T17:15:00.002+01:002011-07-17T17:19:36.963+01:00Functional WPF Part Three<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: x-small;">// Functional WPF Part Three</span><br />
<div class="MsoNormal" style="margin-bottom: 0.0001pt;"><span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: x-small;"><br />
</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Parsing to Xaml</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseColor o = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">match</span> o <span style="color: #00aaff;">with</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Red <span style="color: #00aaff;">-></span> <span style="color: red;">"Red"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Green <span style="color: #00aaff;">-></span> <span style="color: red;">"Green"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Blue <span style="color: #00aaff;">-></span> <span style="color: red;">"Blue"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseOrientation o = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">match</span> o <span style="color: #00aaff;">with</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Horizontal <span style="color: #00aaff;">-></span> <span style="color: red;">"Horizontal"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Vertical <span style="color: #00aaff;">-></span> <span style="color: red;">"Vertical"</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseAttribute attr = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">match</span> attr <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Width x <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"Width = ""%i"""</span> x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Height x <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"Height = ""%i"""</span> x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseAttributes = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> List.fold (<span style="color: #00aaff;">fun</span> acc x <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">"%s %s"</span> acc (parseAttribute x)) <span style="color: red;">""</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> parseBinding (b:Expr) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">match</span> b <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Lambda (_, e) <span style="color: #00aaff;">-></span> parseBinding e<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | PropertyGet (_, info, _) <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"{Binding Path=%s}"</span> (info.Name)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> parseDataTemplate (DataTemplate x) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> sprintf <span style="color: red;">@"<DataTemplate>%s</DataTemplate>"</span> </span><br />
<span style="font-family: Consolas; font-size: 9.5pt;"> (parseFrameworkElement x) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">and</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseFrameworkElement x = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">match</span> x <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Label (s, attrs) <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"<Label Content=""%s"" %s/>"</span> s <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseAttributes attrs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Button s <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"<Button Content=""%s""/>"</span> s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | TextBox (attrs, b) <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"<TextBox %s Text=""%s""/>"</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseAttributes attrs) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseBinding b)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | StackPanel (xs, attrs, orient) <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> (+) x y = sprintf <span style="color: red;">"%s\n%s"</span> x y<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> sprintf <span style="color: red;">@"<StackPanel Orientation = ""%s"" %s>%s</span></span><br />
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="color: red;"> </StackPanel>"</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseOrientation orient)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseAttributes attrs) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (List.fold (<span style="color: #00aaff;">fun</span> acc x <span style="color: #00aaff;">-></span> acc + (parseFrameworkElement x)) <span style="color: red;">""</span> xs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Border (c, x) <span style="color: #00aaff;">-></span> sprintf <span style="color: red;">@"<Border BorderBrush=""%s"" </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: red; font-family: Consolas; font-size: 9.5pt;"> BorderThickness=""2"">%s</Border>"</span><span style="font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseColor c) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseFrameworkElement x)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | ItemsControl t <span style="color: #00aaff;">-></span> </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> sprintf <span style="color: red;">@"<ItemsControl ItemsSource=""{Binding .}""></span></span><span style="font-family: Consolas; font-size: 9.5pt;"> </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span class="Apple-style-span" style="color: red; font-family: Consolas; font-size: 13px;"> <ItemsControl.ItemTemplate>%s</ItemsControl.ItemTemplate></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: red; font-family: Consolas; font-size: 9.5pt;"> </ItemsControl>"</span><span style="font-family: Consolas; font-size: 9.5pt;"> (parseDataTemplate t)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseWindow (Window (c, attrs)) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> sprintf <span style="color: red;">@"<Window %s>%s</Window>"</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseAttributes attrs) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseFrameworkElement c)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> parseApplication (Application c) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> sprintf <span style="color: red;">@"<Application</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: red; font-family: Consolas; font-size: 9.5pt;"> xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: red; font-family: Consolas; font-size: 9.5pt;"> xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: red; font-family: Consolas; font-size: 9.5pt;"> <Application.MainWindow>%s</Application.MainWindow></Application>"</span><span style="font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (parseWindow c)<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-91393812487717324592011-07-17T17:11:00.000+01:002011-07-17T17:11:30.923+01:00Functional WPF Part Two<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Functional WPF Part Two</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;"><br />
</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Helper functions</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> width = Width <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> height = Height<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> stackpanel attrs orient xs = StackPanel (xs, attrs, orient)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> border c x = Border(c, x)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> label attrs s = Label(s, attrs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> button = Button<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> textbox attrs b = TextBox(attrs, b)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> itemscontrol = ItemsControl<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> datatemplate = DataTemplate<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> application = Application<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> window attrs c = Window (c, attrs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-19842846391702504422011-07-17T17:08:00.000+01:002011-07-17T17:08:00.540+01:00Functional WPF Part One<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Functional WPF (An Experiment in F# DSL to Xaml)</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> Microsoft.FSharp.Quotations<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> Microsoft.FSharp.Quotations.Patterns<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Type Definitions</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Color = Red | Green | Blue<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Orientation = Horizontal | Vertical<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Attribute = Width <span style="color: #00aaff;">of</span> int<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Height <span style="color: #00aaff;">of</span> int<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> DataTemplate = DataTemplate <span style="color: #00aaff;">of</span> FrameworkElement<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">and</span><span style="font-family: Consolas; font-size: 9.5pt;"> FrameworkElement <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> = Label <span style="color: #00aaff;">of</span> string * Attribute list<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Button <span style="color: #00aaff;">of</span> string<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | TextBox <span style="color: #00aaff;">of</span> Attribute list * Expr<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | StackPanel <span style="color: #00aaff;">of</span> FrameworkElement list * Attribute list * Orientation<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Border <span style="color: #00aaff;">of</span> Color * FrameworkElement<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | ItemsControl <span style="color: #00aaff;">of</span> DataTemplate<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Window = Window <span style="color: #00aaff;">of</span> FrameworkElement * Attribute list<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Application = Application <span style="color: #00aaff;">of</span> Window<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-29658100585946319372011-05-28T02:41:00.001+01:002011-05-28T13:21:43.804+01:00Reactive Extensions v1.0.10425 Computation Expression Builder<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: 13px;">// Reactive Extensions v1.0.10425 Computation Expression Builder</span><br />
<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: x-small;">// </span><a href="http://msdn.microsoft.com/en-us/data/gg577609">http://msdn.microsoft.com/en-us/data/gg577609</a><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Linq<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Reactive.Linq<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> rxBuilder() = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Bind ((xs:'a IObservable), (f:'a <span class="Apple-style-span" style="color: #00aaff;">-></span> 'b IObservable)) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.SelectMany (xs, f)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Delay f = Observable.Defer f<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Return x = Observable.Return x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.ReturnFrom xs = xs<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Combine (xs:'a IObservable, ys: 'a IObservable) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.Concat (xs, ys)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.For (xs : 'a seq, f: 'a <span style="color: #00aaff;">-></span> 'b IObservable) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.For(xs, <span style="color: #00aaff;">new</span> Func<_, IObservable<_>>(f)) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.TryFinally (xs: 'a IObservable, f : unit <span style="color: #00aaff;">-></span> unit) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.Finally(xs, <span style="color: #00aaff;">new</span> Action(f))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.TryWith (xs: 'a IObservable, f: exn <span style="color: #00aaff;">-></span> 'a IObservable) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.Catch (xs, <span style="color: #00aaff;">new</span> Func<exn, 'a IObservable>(f))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.While (f, xs: 'a IObservable) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.While (<span style="color: #00aaff;">new</span> Func<bool>(f), xs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Yield x = Observable.Return x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.YieldFrom xs = xs<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Zero () = Observable.Empty()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> rx = rxBuilder()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Rx combinators</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> repeat (xs:IObservable<_>) = xs.Repeat()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Sample usages</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> xs = rx { <span style="color: #00aaff;">yield</span> 42<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield</span> 43 }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> ys = rx { <span style="color: #00aaff;">yield</span> 42<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield!</span> xs }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> zs = rx { <span style="color: #00aaff;">for</span> i = 0 <span style="color: #00aaff;">to</span> 10 <span style="color: #00aaff;">do</span> <span style="color: #00aaff;">yield</span> i }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> redTime = rx { <span style="color: #00aaff;">while</span> (DateTime.Now.Second > 30) <span style="color: #00aaff;">do</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield</span> ConsoleColor.Red }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> blueTime = rx { <span style="color: #00aaff;">while</span> (DateTime.Now.Second < 30) <span style="color: #00aaff;">do</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield</span> ConsoleColor.Green }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> coloredTime = rx { <span style="color: #00aaff;">yield!</span> redTime <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield!</span> blueTime } |> repeat<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com1tag:blogger.com,1999:blog-3459037735648203218.post-59370432158839700222011-04-29T19:36:00.005+01:002011-04-30T00:56:22.196+01:00Kleisli List Arrow Combinators<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Kleisli List Arrow</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ( >>= ) : 'a list -> ('a -> 'b list) -> 'b list</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> (>>=) m f = m |> List.map f |> List.concat <o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// unit : 'a -> 'a list</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> unit x = [x]<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Arrow<'i,'o> = Arrow <span style="color: #00aaff;">of</span>('i <span style="color: #00aaff;">-></span> 'o list)<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// arr : ('a -> 'b list) -> Arrow<'a,'b></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> arr f = Arrow f<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// pure' : ('a -> 'b) -> Arrow<'a,'b></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> pure' f = arr (unit << f)<o:p></o:p></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;"></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ( >>>> ) : Arrow<'a,'b> -> Arrow<'b,'c> -> Arrow<'a,'c></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> (>>>>) (Arrow f) (Arrow g) = arr ((<span style="color: #00aaff;">fun</span> m <span style="color: #00aaff;">-></span> m >>= g) << f)<o:p></o:p></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;"></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// first : Arrow<'a,'b> -> Arrow<('a * 'c),('b * 'c)></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> first (Arrow f) = arr (<span style="color: #00aaff;">fun</span>(x,y) <span style="color: #00aaff;">-></span></span><span style="font-family: Consolas; font-size: 9.5pt;"> (f x) >>= </span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;">(<span style="color: #00aaff;">fun</span> x' <span style="color: #00aaff;">-></span> unit (x', y)))</span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// second : Arrow<'a,'b> -> Arrow<('c * 'a),('c * 'b)></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> second (Arrow f) = arr (<span style="color: #00aaff;">fun</span>(x,y) <span style="color: #00aaff;">-></span> (f y) >>= </span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;">(<span style="color: #00aaff;">fun</span> y' <span style="color: #00aaff;">-></span> unit (x, y')))</span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;"><br />
</span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// mapA : Arrow<'a,'b> -> ('b -> 'c) -> Arrow<'a,'c></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Not sure about this one. Is it right ?</span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> mapA m f = m >>>> pure' f</span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// toMonad : Arrow<unit,'a> -> 'a list</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> toMonad (Arrow f) = f()<o:p></o:p></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;"></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// map : 'a list -> ('a -> 'b) -> 'b list</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> map m f = mapA (arr (<span style="color: #00aaff;">fun </span>_ <span style="color: #00aaff;">-></span> m)) f |> toMonad<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// bind : 'a list -> ('a -> 'b list) -> 'b list</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> bind m f = (arr (<span style="color: #00aaff;">fun</span> _ <span style="color: #00aaff;">-></span> m) >>>> arr f) |> toMonad<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> fix f x = f (fix f) x<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// mfix : ('a -> 'a list) -> 'a list</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt;">// This one is wrong. Help!</span></div><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> mfix f = <span style="color: #00aaff;">match</span> fix (</span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"><span style="color: #00aaff;">fun</span></span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"> x -> </span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"><span style="color: #00aaff;">fun</span></span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"> </span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;">() -> f(List.head (x()))) () <span style="color: #00aaff;">with</span></span><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | [] <span style="color: #00aaff;">-></span> []</span></div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | x::_ <span style="color: #00aaff;">-></span> x :: mfix (List.tail<< f)<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// liftM : ('a -> 'b) -> 'a list -> 'b list</span></div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> liftM f m = m >>= (<span style="color: #00aaff;">fun </span>a <span style="color: #00aaff;">-></span> unit (f a))<o:p></o:p></span></div><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// loop : Arrow<('a * 'b),('c * 'b)> -> Arrow<'a,'c></span></div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> loop (Arrow f) = <span style="color: #00aaff;">let</span> f' x y = f (x, snd y)</span></div><div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> arr (liftM fst << mfix << f')<o:p></o:p></span></div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com1tag:blogger.com,1999:blog-3459037735648203218.post-80224371587191220582010-08-15T23:50:00.000+01:002010-08-15T23:50:25.654+01:00Hindley Milner Type Inference Sample Implementation<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Learn more about F# at http://fsharp.net</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Hindley Milner Type Inference Sample Implementation</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// AST</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Literal<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>= Char<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span><span style="mso-spacerun: yes;"> </span>char<span style="mso-spacerun: yes;"> </span><span style="color: green;">// character literal</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| String <span style="color: #00aaff;">of</span> string<span style="mso-spacerun: yes;"> </span><span style="color: green;">// string literal</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Integer <span style="color: #00aaff;">of</span><span style="mso-spacerun: yes;"> </span>int<span style="mso-spacerun: yes;"> </span><span style="color: green;">// integer literal</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Float<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span><span style="mso-spacerun: yes;"> </span>float<span style="mso-spacerun: yes;"> </span><span style="color: green;">// floating point literal<span style="mso-spacerun: yes;"> </span></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Exp <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>= Var<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span> string<span style="mso-spacerun: yes;"> </span><span style="color: green;">// variable<span style="mso-spacerun: yes;"> </span></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Lam<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span> string * Exp<span style="mso-spacerun: yes;"> </span><span style="color: green;">// lambda abstraction</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| App<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span> Exp * Exp<span style="mso-spacerun: yes;"> </span><span style="color: green;">// application<span style="mso-spacerun: yes;"> </span></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| InfixApp <span style="color: #00aaff;">of</span> Exp * string * Exp<span style="mso-spacerun: yes;"> </span><span style="color: green;">// infix application</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Let<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span> string * Exp * Exp<span style="mso-spacerun: yes;"> </span><span style="color: green;">// local definition<span style="mso-spacerun: yes;"> </span></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Lit<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">of</span> Literal<span style="mso-spacerun: yes;"> </span><span style="color: green;">// literal </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Type Tree</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Type<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>= TyLam <span style="color: #00aaff;">of</span> Type * Type<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar <span style="color: #00aaff;">of</span> string<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyCon <span style="color: #00aaff;">of</span> string * Type list<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">with</span> <span style="color: #00aaff;">override</span> this.ToString() = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> this <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyLam (t1, t2) <span style="color: #00aaff;">-></span> sprintf <span style="color: maroon;">"(%s -> %s)"</span> (t1.ToString()) (t2.ToString())<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar a <span style="color: #00aaff;">-></span> a<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyCon (s, ts) <span style="color: #00aaff;">-></span> s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Subtitutions</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Subst = Subst <span style="color: #00aaff;">of</span> Map<string, Type><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// extend: string -> Type -> Subst -> Subst</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> extend v t (Subst s) = Subst (Map.add v t s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// lookup: string -> Subst -> Type</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> lookup v (Subst s) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">if</span> (Map.containsKey v s) <span style="color: #00aaff;">then</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Map.find v s <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">else</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>TyVar v<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Apply a type substitution to a type </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// subs: Type -> Subst -> Type</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> subs t s = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> t <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar n <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> t' = lookup n s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">if</span> t = t' <span style="color: #00aaff;">then</span> t'<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">else</span> subs t' s<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyLam(a, r) <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>TyLam(subs a s, subs r s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyCon(name, tyArgs) <span style="color: #00aaff;">-></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>TyCon(name, tyArgs <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>|> List.map (<span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> subs x s))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Environments</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> TyScheme = TyScheme <span style="color: #00aaff;">of</span> Type * Set<string><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Env = Env <span style="color: #00aaff;">of</span> Map<string, TyScheme><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Calculate the list of type variables occurring in a type,</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// without repeats</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// getTVarsOfType: Type -> Set<string></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> getTVarsOfType t = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> t <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar n<span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">-></span> Set.singleton n<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyLam(t1, t2) <span style="color: #00aaff;">-></span> getTVarsOfType(t1) + getTVarsOfType(t2)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyCon(_, args) <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>List.fold (<span style="color: #00aaff;">fun</span> acc t <span style="color: #00aaff;">-></span> acc + getTVarsOfType t) Set.empty args<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// getTVarsOfScheme: TyScheme -> Set<string></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> getTVarsOfScheme (TyScheme (t, tvars)) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>(getTVarsOfType t) - tvars<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// getTVarsOfEnv: Env -> Set<string></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> getTVarsOfEnv (Env e) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> schemes = e |> Map.toSeq |> Seq.map snd<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Seq.fold (<span style="color: #00aaff;">fun</span> acc s <span style="color: #00aaff;">-></span> acc + (getTVarsOfScheme s)) Set.empty schemes<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Unification</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">exception</span><span style="font-family: Consolas; font-size: 9.5pt;"> UnificationError <span style="color: #00aaff;">of</span> Type * Type<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Calculate the most general unifier of two types, </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// raising a UnificationError if there isn't one </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// mgu: Type -> Type -> Subst -> Subst</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> mgu a b s =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> (subs a s, subs b s) <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar ta, TyVar tb <span style="color: #00aaff;">when</span> ta = tb <span style="color: #00aaff;">-></span> s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar ta, _ <span style="color: #00aaff;">when</span> not <| Set.contains ta (getTVarsOfType b) <span style="color: #00aaff;">-></span> extend ta b s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span>| _, TyVar _ <span style="color: #00aaff;">-></span> mgu b a s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyLam (a1, b1), TyLam (a2, b2) <span style="color: #00aaff;">-></span> mgu a1 a2 (mgu b1 b2 s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyCon(name1, args1), TyCon(name2, args2) <span style="color: #00aaff;">when</span> name1 = name2 <span style="color: #00aaff;">-></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>(s, args1, args2) |||> List.fold2 (<span style="color: #00aaff;">fun</span> subst t1 t2 <span style="color: #00aaff;">-></span> mgu t1 t2 subst)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| x,y <span style="color: #00aaff;">-></span> raise <| UnificationError (x,y) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// State Monad</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> State<'state, 'a> = State <span style="color: #00aaff;">of</span> ('state <span style="color: #00aaff;">-></span>'a * 'state)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> run (State f) s = f s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> StateMonad() = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">member</span> b.Bind(State m, f) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>State (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="color: #00aaff;"> let</span> (v,s') = m s <span style="color: #00aaff;">in</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> (State n) = f v <span style="color: #00aaff;">in</span> n s')<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">member</span> b.Return x = State (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> x, s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">member</span> b.ReturnFrom x = x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">member</span> b.Zero () = State (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> (), s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">member</span> b.Combine(r1, r2) = b.Bind(r1, <span style="color: #00aaff;">fun</span> () <span style="color: #00aaff;">-></span> r2)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">member</span> b.Delay f = State (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> run (f()) s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> state = StateMonad()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> getState = State (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> s, s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> setState s = State (<span style="color: #00aaff;">fun</span> _ <span style="color: #00aaff;">-></span> (), s)<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> execute m s = <span style="color: #00aaff;">match</span> m <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| State f <span style="color: #00aaff;">-></span> <span style="color: #00aaff;">let</span> r = f s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> r <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>|(x,_) <span style="color: #00aaff;">-></span> x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> mmap f xs = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> <span style="color: #00aaff;">rec</span> MMap' (f, xs', out) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>state { <span style="color: #00aaff;">match</span> xs' <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| h :: t <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> h' = f(h)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return!</span> MMap'(f, t, List.append out [h'])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| [] <span style="color: #00aaff;">-></span> <span style="color: #00aaff;">return</span> out }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>MMap' (f, xs, [])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Alpha converter (Converts T4, T5, T6 to 'a, 'b, 'c)</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> getName k =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> containsKey k = state { <span style="color: #00aaff;">let!</span> (map, id) = getState<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> Map.containsKey k map }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> addName k = state { <span style="color: #00aaff;">let!</span> (map, id) = getState<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> newid = char (int id + 1)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">do!</span> setState(Map.add k id map, newid) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> () }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>state { <span style="color: #00aaff;">let!</span> success = containsKey k<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">if</span> (not success) <span style="color: #00aaff;">then</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">do!</span> addName k<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> (map, id) = getState<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> Map.find k map }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// renameTVarsToLetters: Type -> Type</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> renameTVarsToLetters t =<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> <span style="color: #00aaff;">rec</span> run x = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>state {<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> x <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyVar(name) <span style="color: #00aaff;">-></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> newName = getName name<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> TyVar(sprintf <span style="color: maroon;">"'%c"</span> newName)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyLam(arg, res) <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> t1 = run arg<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> t2 = run res<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> TyLam(t1, t2)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| TyCon(name, typeArgs) <span style="color: #00aaff;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> list = mmap (<span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> run x) typeArgs<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> TyCon(name, list) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>execute (run t) (Map.empty, <span style="color: maroon;">'a'</span>)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ****************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Calculate principal Type</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ****************************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> newTyVar = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>state { <span style="color: #00aaff;">let!</span> x = getState<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">do!</span> setState(x + 1)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> TyVar(sprintf <span style="color: maroon;">"T%d"</span> x) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> integerCon = TyCon(<span style="color: maroon;">"int"</span>, [])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> floatCon = TyCon(<span style="color: maroon;">"float"</span>, [])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> charCon = TyCon(<span style="color: maroon;">"char"</span>, [])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> stringCon = TyCon(<span style="color: maroon;">"string"</span>, [])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> litToTy lit = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> lit <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Integer _ <span style="color: #00aaff;">-></span> integerCon<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Float _ <span style="color: #00aaff;">-></span> floatCon<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Char _ <span style="color: #00aaff;">-></span> charCon<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| String<span style="mso-spacerun: yes;"> </span>_ <span style="color: #00aaff;">-></span> stringCon<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Calculate the principal type scheme for an expression in a given </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// typing environment </span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// tp: Env -> Exp -> Type -> Subst -> State<int, Subst></span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> tp env exp bt s = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> findSc n (Env e) = Map.find n e<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> containsSc n (Env e) = Map.containsKey n e<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> addSc n sc (Env e) = Env (Map.add n sc e)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>state {<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">match</span> exp <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Lit v <span style="color: #00aaff;">-></span><span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> mgu (litToTy v) bt s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Var n <span style="color: #00aaff;">-></span><span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">if</span> not (containsSc n env) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">then</span> failwith <span style="color: maroon;">"Name %s no found"</span> n <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> (TyScheme (t, _)) = findSc n env<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> mgu (subs t s) bt s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Lam (x, e) <span style="color: #00aaff;">-></span><span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> a = newTyVar<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> b = newTyVar<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> s1 = mgu bt (TyLam (a, b)) s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> newEnv = addSc x (TyScheme (a, Set.empty)) env<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return!</span> tp newEnv e b s1<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| App(e1, e2) <span style="color: #00aaff;">-></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> a = newTyVar<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> s1 = tp env e1 (TyLam(a, bt)) s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return!</span> tp env e2 a s1<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| InfixApp(e1, op, e2) <span style="color: #00aaff;">-></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> exp1 = App(App(Var op, e1), e2)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return!</span> tp env exp1 bt s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>| Let(name, inV, body) <span style="color: #00aaff;">-></span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> a = newTyVar<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> s1 = tp env inV a s<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> t = subs a s1<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> newScheme = TyScheme (t, ((getTVarsOfType t) - (getTVarsOfEnv env)))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return!</span> tp (addSc name newScheme env) body bt s1 }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> predefinedEnv = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Env([<span style="color: maroon;">"+"</span>, TyScheme (TyLam(integerCon, TyLam(integerCon, integerCon)), Set.empty)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: maroon;">"*"</span>, TyScheme (TyLam(integerCon, TyLam(integerCon, integerCon)), Set.empty)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: maroon;">"-"</span>, TyScheme (TyLam(integerCon, TyLam(integerCon, integerCon)), Set.empty)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>] |> Map.ofList)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// typeOf: Exp -> Type</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> typeOf exp =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> typeOf' exp = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>state { <span style="color: #00aaff;">let!</span> (a:Type) = newTyVar<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let</span> emptySubst = Subst (Map.empty)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">let!</span> s1 = tp predefinedEnv exp a emptySubst<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">return</span> subs a s1 }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #00aaff;">in</span> execute (typeOf' exp) 0 |> renameTVarsToLetters<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ***********************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Example</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// ***********************************************************</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> composeAst = Let(<span style="color: maroon;">"compose"</span>, <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Lam(<span style="color: maroon;">"f"</span>, <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Lam(<span style="color: maroon;">"g"</span>, <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Lam (<span style="color: maroon;">"x"</span>, <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>App(Var <span style="color: maroon;">"g"</span>, App(Var <span style="color: maroon;">"f"</span>, Var <span style="color: maroon;">"x"</span>))))), <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>Var <span style="color: maroon;">"compose"</span>)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> t = typeOf composeAst<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">printfn <span style="color: maroon;">"%s"</span> (t.ToString())<o:p></o:p></span></div><div class="MsoNormal"><br />
</div></span></span>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com2tag:blogger.com,1999:blog-3459037735648203218.post-9458934256140905262010-06-20T19:36:00.000+01:002010-06-20T19:36:38.769+01:00Subsequences of a seq<'a><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> cons x xs = seq { <span style="color: #00aaff;">yield</span> x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield!</span> xs }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> (|Empty|Cons|) xs : Choice<Unit, 'a * seq<'a>> =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">if</span> (Seq.isEmpty xs) <span style="color: #00aaff;">then</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Empty <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">else</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Cons(Seq.head xs, Seq.skip 1 xs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> subseq xs = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">match</span> xs <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Empty <span style="color: #00aaff;">-></span> seq[seq[]]<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Cons(x,xs) <span style="color: #00aaff;">-></span> <span style="color: #00aaff;">let</span> subseq = subseq xs <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Seq.append (Seq.map (cons x) subseq) subseq <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> FsCheck<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> MyGenerators =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">static</span> <span style="color: #00aaff;">member</span> Seq() =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> fsList = Arb.Default.FsList()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> {<span style="color: #00aaff;">new</span> Arbitrary<seq<'a>>() <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">override</span> x.Generator = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Gen.resize 10 (Gen.map (List.toSeq) (fsList.Generator))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">override</span> x.Shrinker t = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Seq.map (List.toSeq) (fsList.Shrinker(Seq.toList t)) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">ignore (Arb.register<MyGenerators>())<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> xs <span style="color: #00aaff;">-></span> (Seq.length (subseq xs) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> int (Math.Pow(2.0, (float (Seq.length xs))))))<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com1tag:blogger.com,1999:blog-3459037735648203218.post-65532650152740744082010-06-19T20:07:00.001+01:002010-06-20T01:47:48.491+01:00Factorial using only Algebraic Data Types and Pattern Matching<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Nat = Zero | Succ <span style="color: #00aaff;">of</span> Nat<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> one = Succ Zero<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> two = Succ (Succ Zero)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> three = Succ (Succ (Succ Zero))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> add x y = <span style="color: #00aaff;">match</span> x <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Zero <span style="color: #00aaff;">-></span> y<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Succ x <span style="color: #00aaff;">-></span> Succ (add x y)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> mul x y = <span style="color: #00aaff;">match</span> y <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Zero <span style="color: #00aaff;">-></span> Zero<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Succ Zero <span style="color: #00aaff;">-></span> x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Succ y <span style="color: #00aaff;">-></span> add x (mul x y)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> fac n = <span style="color: #00aaff;">match</span> n <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Zero <span style="color: #00aaff;">-></span> Succ Zero<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Succ x <span style="color: #00aaff;">-></span> mul n (fac x)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> FsCheck<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Addition properties</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> x y <span style="color: #00aaff;">-></span> (add x y) = (add y x))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> x y z <span style="color: #00aaff;">-></span> (add x (add y z)) = (add (add x y) z))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> (add x Zero) = x)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// Multiplication properties</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> x y <span style="color: #00aaff;">-></span> (mul x y) = (mul y x))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> x y z <span style="color: #00aaff;">-></span> (mul x (mul y z)) = (mul (mul x y) z))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Check.Quick (<span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> (mul x one) = x)<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-45725612776580270702010-05-08T19:56:00.005+01:002010-05-08T20:03:00.736+01:00Composing Contracts Part 4: Sample Usage<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
Composing contracts: an adventure in financial engineering<br />
<a href="http://research.microsoft.com/en-us/um/people/simonpj/papers/financial-contracts/contracts-icfp.htm">http://research.microsoft.com/en-us/um/people/simonpj/papers/financial-contracts/contracts-icfp.htm</a><br />
<br />
<br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> ContractDataTypes<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> Contracts<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> t1 = Date(DateTime.Today.AddSeconds(10.0))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">// zero-coupon bond<o:p></o:p></span></div></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> c1 = zcb t1 10.0 USD<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> ret = eval c1<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">ret.Subscribe(printf <span style="color: maroon;">"%A"</span>)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">Console.ReadLine ()<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-30211070717525341872010-05-08T19:07:00.001+01:002010-05-08T20:04:51.853+01:00Composing Contracts Part 3: Sample Implementation<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">module</span><span style="font-family: Consolas; font-size: 9.5pt;"> Contracts<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Linq<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> ContractDataTypes<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> date s = Date (DateTime.Parse s)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> one c = One c<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> scale k c = Scale(k, c)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> konst x = rx { <span style="color: #00aaff;">return</span> x }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> (==*) l r = rx { <span style="color: #00aaff;">let!</span> x = l<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let!</span> y = r<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> x = y }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> obsTime = rx { <span style="color: #00aaff;">let!</span> x = Observable.Interval(TimeSpan.FromSeconds(1.0))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> Date(DateTime.Today.AddSeconds (float x)) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> at t = obsTime ==* (konst t)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> cWhen t c = When (t, c)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">// zero-coupon bond</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> zcb t x k = cWhen (at t) (scale (konst x) (one k))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> eval c = <span style="color: #00aaff;">match</span> c <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | When (t, c) <span style="color: #00aaff;">-></span> rx { <span style="color: #00aaff;">let!</span> x = t<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">if</span> x <span style="color: #00aaff;">then</span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return!</span> (eval c) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Scale (k, c) <span style="color: #00aaff;">-></span> rx { <span style="color: #00aaff;">let!</span> x = k<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let!</span> y = eval c<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> x * y }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | One c <span style="color: #00aaff;">-></span> <span style="color: #00aaff;">match</span> c <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | GBP <span style="color: #00aaff;">-></span> rx { <span style="color: #00aaff;">return</span> Money (1.0, GBP) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | USD <span style="color: #00aaff;">-></span> rx { <span style="color: #00aaff;">return</span> Money (0.675310643, GBP) }<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-1477942925142452042010-05-08T19:00:00.005+01:002010-05-08T20:05:11.315+01:00Composing Contracts Part 2: Signatures<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"></span></span><br />
<span class="Apple-style-span" style="font-size: small;"></span><br />
<span class="Apple-style-span" style="font-size: small;"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">module</span><span style="font-family: Consolas; font-size: 9.5pt;"> Contracts<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> ContractDataTypes<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> date: String <span style="color: #00aaff;">-></span> Date<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> one : Currency <span style="color: #00aaff;">-></span> Contract<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> scale : IObservable<double> <span style="color: #00aaff;">-></span> Contract <span style="color: #00aaff;">-></span> Contract<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> konst : 'a <span style="color: #00aaff;">-></span> IObservable<'a><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> (==*) : IObservable<'a> <span style="color: #00aaff;">-></span> IObservable<'a> <span style="color: #00aaff;">-></span> IObservable<bool> <span style="color: #00aaff;">when</span> 'a : equality<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> obsTime : IObservable<Date><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> at: Date <span style="color: #00aaff;">-></span> IObservable<bool><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> cWhen: IObservable<bool> <span style="color: #00aaff;">-></span> Contract <span style="color: #00aaff;">-></span> Contract<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">// zero-coupon bond</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> zcb : Date <span style="color: #00aaff;">-></span> Double <span style="color: #00aaff;">-></span> Currency <span style="color: #00aaff;">-></span> Contract <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">val</span><span style="font-family: Consolas; font-size: 9.5pt;"> eval: Contract <span style="color: #00aaff;">-></span> IObservable<Money><o:p></o:p></span></div><div class="MsoNormal"><br />
</div></span></div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-36075774355548351302010-05-08T18:57:00.002+01:002010-05-08T19:04:50.521+01:00Composing Contracts Part 1: Data Types<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">module</span><span style="font-family: Consolas; font-size: 9.5pt;"> ContractDataTypes<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Linq<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Date = Date <span style="color: #00aaff;">of</span> DateTime<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Days = Days <span style="color: #00aaff;">of</span> TimeSpan<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Currency = GBP | USD<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Money = Money <span style="color: #00aaff;">of</span> float * Currency<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">with</span> <span style="color: #00aaff;">static</span> <span style="color: #00aaff;">member</span> (*) (k, Money (v, c)) = Money (k * v, c)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> Contract = | One <span style="color: #00aaff;">of</span> Currency<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Scale <span style="color: #00aaff;">of</span> (IObservable<double> * Contract)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | When <span style="color: #00aaff;">of</span> (IObservable<bool> * Contract)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> RxBuilder() =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Bind(m:IObservable<'a>, f:'a <span style="color: #00aaff;">-></span> IObservable<'b>) = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> Observable.SelectMany(m, <span style="color: #00aaff;">new</span> Func<'a, IObservable<'b>> (f))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Return x = Observable.Return x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.ReturnFrom x = x<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Zero() = Observable.Empty()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> rx = RxBuilder()<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-29081533666234957002010-05-04T01:46:00.008+01:002010-05-04T12:43:34.677+01:00Monad State Transformer<div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><br />
<br />
<span class="Apple-style-span" style="font-family: Consolas; font-size: small;"><span class="Apple-style-span" style="color: black; font-size: 13px;"><span style="color: #999999;">This is an attempt to write a State Monad Transformer. <br />
I haven't been able to make it generic and according to <br />
<strong>Brian McNamara "this will never be possible in any .NET language"</strong></span> </span></span><br />
<span class="Apple-style-span" style="font-family: Consolas; font-size: small;"><span class="Apple-style-span" style="color: black; font-size: 13px;"><br />
<br />
</span></span><a href="http://cs.hubfs.net/forums/thread/13974.aspx">http://cs.hubfs.net/forums/thread/13974.aspx</a></div><br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> StateT<'a, 'b, 'state> = StateT <span style="color: #00aaff;">of</span> ('state <span style="color: #00aaff;">-></span> Parser<'a * 'state, 'b>)</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">type</span><span style="font-family: Consolas; font-size: 9.5pt;"> StateTBuilder (p:ParserMonad) =</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: green;">// a -> m a</span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Return a = StateT (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> p.Return(a, s))</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: green;">// m a -> (a -> m b) -> m b</span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">member</span> this.Bind (m, f) = StateT (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> p { <span style="color: #00aaff;">let!</span> (v, s') = <span style="color: #00aaff;">let</span> (StateT f) = m <span style="color: #00aaff;">in</span> f s</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> (StateT f') = f v</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return!</span> f' s' })</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span class="Apple-style-span" style="font-family: Consolas; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><br />
</span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> statefulParser = StateTBuilder(parser)</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> getState = StateT (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> parser.Return(s, s))</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> setState s = StateT (<span style="color: #00aaff;">fun</span> _ <span style="color: #00aaff;">-></span> parser.Return((), s))</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> lift c = StateT (<span style="color: #00aaff;">fun</span> s <span style="color: #00aaff;">-></span> parser.Bind (c, (<span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> parser.Return (x, s))))</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> Execute m s = <span style="color: #00aaff;">let</span> (StateT f) = m <span style="color: #00aaff;">in</span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> parser { <span style="color: #00aaff;">let!</span> (x,_) = f s </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> x }</span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-75420251825078028212010-04-25T03:01:00.001+01:002010-04-25T03:02:09.281+01:00SplitAt (Alternate definition)<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;"><br />
</span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> splitAt n xs = <span style="color: #00aaff;">match</span> (n, xs) <span style="color: #00aaff;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | 0, xs <span style="color: #00aaff;">-></span> ([], xs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | _, [] <span style="color: #00aaff;">-></span> ([], [])<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | n, x::xs <span style="color: #00aaff;">-></span> <span style="color: #00aaff;">let</span> (xs', xs'') = splitAt (n - 1) xs <span style="color: #00aaff;">in</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (x::xs', xs'')<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-73370237358099039162010-04-23T01:05:00.001+01:002010-04-23T01:06:07.711+01:00C# SplitEvery<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;"><br />
</span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">private</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">static</span> <span style="color: #2b91af;">IEnumerable</span><<span style="color: #2b91af;">IEnumerable</span><T>> SplitEvery<T>(<span style="color: #00aaff;">this</span> <span style="color: #2b91af;">IEnumerable</span><T> xs, <span style="color: #00aaff;">int</span> n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> xs.Unfold(ys => ys.Take(n), ys => ys.Any(), ys => ys.Skip(n));<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">private</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">static</span> <span style="color: #2b91af;">IEnumerable</span><T> Unfold<T>(<span style="color: #00aaff;">this</span> T x, <span style="color: #2b91af;">Func</span><T, T> h, <span style="color: #2b91af;">Func</span><T, <span style="color: #00aaff;">bool</span>> p, <span style="color: #2b91af;">Func</span><T, T> t)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">for</span> (<span style="color: #00aaff;">var</span> i = x; p(i); i = t(i))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield</span> <span style="color: #00aaff;">return</span> h(i);<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">} <o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com2tag:blogger.com,1999:blog-3459037735648203218.post-73007110249361517582010-04-23T00:51:00.001+01:002010-04-23T00:51:37.425+01:00SplitEvery (New version, no explicit recursion)<span class="Apple-style-span" style="color: green; font-family: Consolas; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><br />
</span></span><br />
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Linq<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> repeat x = Seq.initInfinite (<span style="color: #00aaff;">fun</span> _ <span style="color: #00aaff;">-></span> x)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> scan = Seq.scan<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> iterate f x = scan (<span style="color: #00aaff;">fun</span> l _ <span style="color: #00aaff;">-></span> f l) x (repeat x)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> any = Enumerable.Any<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> take n = <span style="color: #00aaff;">fun</span> xs <span style="color: #00aaff;">-></span> Enumerable.Take (xs, n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> skip n = <span style="color: #00aaff;">fun</span> xs <span style="color: #00aaff;">-></span> Enumerable.Skip (xs, n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> unfold h p t = iterate t >> Seq.takeWhile p >> Seq.map h <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> splitAt n = unfold (take n) any (skip n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-60122373896990414012010-04-13T20:39:00.006+01:002010-04-14T09:04:36.370+01:00C# Permutations (using Rx System.Interactive)<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">static</span> <span style="color: #2b91af;">IEnumerable</span><<span style="color: #2b91af;">IEnumerable</span><T>> Permutations<T>(<span style="color: #00aaff;">this</span> <span style="color: #2b91af;">IEnumerable</span><T> xs)</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">if</span> (!xs.Any())<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> <span style="color: #2b91af;">EnumerableEx</span>.Return(<span style="color: #2b91af;">Enumerable</span>.Empty<T>());<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">else</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">return</span> <span style="color: #00aaff;">from</span> zs <span style="color: #00aaff;">in</span> Permutations(xs.Skip(1))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">from</span> i <span style="color: #00aaff;">in</span> <span style="color: #2b91af;">Enumerable</span>.Range(0, zs.Count() + 1)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">select</span> zs.Take(i).Concat(<span style="color: #2b91af;">EnumerableEx</span>.Return(xs.First())).Concat(zs.Skip(i)); <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></div><div class="MsoNormal"><br />
</div></span></span>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com2tag:blogger.com,1999:blog-3459037735648203218.post-36536724420312635362010-04-11T20:49:00.001+01:002010-04-11T20:51:41.990+01:00Permutations<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> length = Seq.length<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> take = Seq.take<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> skip = Seq.skip<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> (++) = Seq.append<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> concat = Seq.concat<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> map = Seq.map<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> (|Empty|Cons|) (xs:seq<'a>) : Choice<Unit, 'a * seq<'a>> = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;;">if</span> (Seq.isEmpty xs) <span style="color: #00aaff;;">then</span> Empty <span style="color: #00aaff;;">else</span> Cons(Seq.head xs, Seq.skip 1 xs)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> interleave x ys = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> seq { <span style="color: #00aaff;;">for</span> i <span style="color: #00aaff;;">in</span> [0..length ys] <span style="color: #00aaff;;">-></span> <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> (take i ys) ++ seq [x] ++ (skip i ys) }<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff;; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;;">rec</span> permutations xs = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;;">match</span> xs <span style="color: #00aaff;;">with</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Empty <span style="color: #00aaff;;">-></span> seq [seq []]<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> | Cons(x,xs) <span style="color: #00aaff;;">-></span> concat(map (interleave x) (permutations xs))<o:p></o:p></span></div><div class="MsoNormal"><br />
</div></span></span>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-1327123907745716852010-03-30T01:09:00.003+01:002010-04-11T20:59:22.291+01:00Generic Monadic Map and Join using statically resolved type variables<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;"><br />
</span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">inline</span> mapM b f m = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> unit x = (^x: (<span style="color: #00aaff;">member</span> Return: ^b <span style="color: #00aaff;">-></span> ^n) b, x) <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> (>>=) m f = (^x: (<span style="color: #00aaff;">member</span> Bind: ^m <span style="color: #00aaff;">-></span> (^a <span style="color: #00aaff;">-></span> ^n) <span style="color: #00aaff;">-></span> ^n) b, m, f)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> m >>= (<span style="color: #00aaff;">fun</span> x <span style="color: #00aaff;">-></span> unit (f x))<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">inline</span> joinM b m = <o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> (>>=) m f = (^x: (<span style="color: #00aaff;">member</span> Bind: ^m <span style="color: #00aaff;">-></span> (^n <span style="color: #00aaff;">-></span> ^n) <span style="color: #00aaff;">-></span> ^n) b, m, f)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> m >>= id<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com0tag:blogger.com,1999:blog-3459037735648203218.post-70582079471683160682010-03-12T17:43:00.003+00:002010-04-11T21:15:04.872+01:00SplitEvery (chunk)<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;"><br />
</span><br />
<span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Collections.Generic<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">open</span><span style="font-family: Consolas; font-size: 9.5pt;"> System.Linq<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: green; font-family: Consolas; font-size: 9.5pt;">//splitEvery :: Int -> [a] -> [[a]]</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> splitAt n (xs:IEnumerable<'a>) = (xs.Take n, xs.Skip n)<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><br />
</div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="color: #00aaff; font-family: Consolas; font-size: 9.5pt;">let</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">rec</span> splitEvery n xs =<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">let</span> (ks, vs) = splitAt n xs <span style="color: #00aaff;">in</span><o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> seq { <span style="color: #00aaff;">yield</span> ks<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #00aaff;">yield!</span> splitEvery n vs }<o:p></o:p></span></div><div class="MsoNormal"><br />
</div>holoedhttp://www.blogger.com/profile/06023475066034907250noreply@blogger.com6