<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Thoughts and Code</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/default.aspx</link><description>Logic, art, coding...</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>FP Hacker Wanted</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2011/09/01/fp-hacker-wanted.aspx</link><pubDate>Fri, 02 Sep 2011 03:44:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67008</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/67008.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=67008</wfw:commentRss><description>&lt;div&gt;H ομάδα μου και εγώ προσωπικά αναζητούμε F# hacker. Για περισσότερες πληροφορίες στείλτε μου PM.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;"Είμαστε μια μικρή ομάδα έμπειρων F# προγραμματιστών και αναζητούμε νεαρό ταλαντούχο hacker&lt;/div&gt;&lt;div&gt;&amp;nbsp;για να δουλέψει μαζί μας σε ένα πολύ ενδιαφέρον και φιλόδοξο F# based cloud programming framework-runtime (&lt;a href="http://www.m-brace.net"&gt;M-Brace&lt;/a&gt;).&amp;nbsp;&lt;/div&gt;&lt;div&gt;Αν και οι γνώσεις γύρω από F# και .Net δεν είναι απαραίτητες, απαιτείται τουλάχιστον καλή γνώση και εμπειρία σε κάποια functional γλώσσα&amp;nbsp;&lt;/div&gt;&lt;div&gt;(Lisp family, ML family, Haskell, Erlang, FP Scala) καθώς και&amp;nbsp;&amp;nbsp;πάθος-όρεξη &amp;nbsp;για applied functional programming.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Για περισσότερες πληροφορίες και για αποστολή βιογραφικών nessos@nessos.gr"&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=67008" width="1" height="1"&gt;</description></item><item><title>F# in the Enterprise</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2011/03/03/f-in-the-enterprise.aspx</link><pubDate>Fri, 04 Mar 2011 01:37:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63951</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/63951.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=63951</wfw:commentRss><description>&lt;div&gt;Αργά αλλα σταθερά η F# δείχνει την δύναμη της και εδραιώνεται στις συνειδήσεις των .Net προγραμματιστών.&lt;/div&gt;&lt;div&gt;Μετά και την ανακοίνωση του Async support στις vNext (C#, Vb) είναι ξεκάθαρο ότι η F# επηρεάζει και ξεχωρίζει.&lt;/div&gt;&lt;div&gt;Στο παρακάτω link όσοι ενδιαφέρονται μπορούν να δουν και το enterprise πρόσωπο της F#.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://msdn.microsoft.com/en-us/fsharp/gg634701"&gt;http://msdn.microsoft.com/en-us/fsharp/gg634701&lt;/a&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=63951" width="1" height="1"&gt;</description></item><item><title>Lazy but Fast</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2011/01/06/lazy-but-fast.aspx</link><pubDate>Fri, 07 Jan 2011 02:10:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:62141</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/62141.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=62141</wfw:commentRss><description>&lt;div&gt;Πολλές φορες έχω κάποιο αναδρομικό αλγόριθμο (p.x traversal ενός tree) και θέλω να τον εκτελέσω lazy.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Δυστυχώς και σε F# (seq) και σε C# (iterators), οι αλγόριθμοι καταλήγουν σε quadratic time και πολλές φορες σε stack-overflows.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Κουρασμένος από αυτή την κατάσταση, κατέληξα στο κάτωθι.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;open System.Collections
open System.Collections.Generic

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// LazyList dataType + Monoid Structure&lt;/span&gt;
type LazyList&amp;lt;'T&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;   Empty
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Cons of 'T &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; (unit -&amp;gt; LazyList&amp;lt;'T&amp;gt;)
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Delay of (unit -&amp;gt; LazyList&amp;lt;'T&amp;gt;)
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Combine of LazyList&amp;lt;'T&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; LazyList&amp;lt;'T&amp;gt; with
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;interface&lt;/span&gt; IEnumerable&amp;lt;'T&amp;gt; with
            member self.GetEnumerator() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
                &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// tail-recursive enumeration &lt;/span&gt;
                let rec toSeq stack &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
                    match stack with
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; [] -&amp;gt; Seq.empty
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; head :: tail -&amp;gt;
                        match head with
                        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Empty -&amp;gt; toSeq tail
                        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Cons (value, rest) -&amp;gt; seq { yield value; yield! toSeq &amp;lt;| rest () :: tail }
                        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Delay f -&amp;gt; toSeq &amp;lt;| f () :: tail
                        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Combine (first, second) -&amp;gt; toSeq &amp;lt;| first :: second :: tail
                (toSeq [self]).GetEnumerator() 
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;interface&lt;/span&gt; IEnumerable with 
            member self.GetEnumerator() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (self :&amp;gt; IEnumerable&amp;lt;'T&amp;gt;).GetEnumerator() :&amp;gt; _ 

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Monoid Comprehension&lt;/span&gt;
type LazyListBuilder() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
    member self.Yield value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Cons (value, fun () -&amp;gt; Empty)
    member self.YieldFrom value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; value
    member self.Combine(first, second) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Combine (first, second) 
    member self.Delay f &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Delay f
    member self.Zero() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Empty

let lazyList &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; LazyListBuilder()


&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Example&lt;/span&gt;
#time
type Tree&amp;lt;'T&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Empty &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Branch of 'T &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; Tree&amp;lt;'T&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; Tree&amp;lt;'T&amp;gt;

let rec createBalancedTree n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; n &amp;lt;= 0 then Empty
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; Branch (n, createBalancedTree (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; 1), createBalancedTree (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; 1))

let rec createLeftSpinedTree n acc &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; n &amp;lt;= 0 then acc
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; createLeftSpinedTree (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; 1) (Branch (n, acc, Empty))

let tree &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; createBalancedTree 20
let leftSpinedTree &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; createLeftSpinedTree 100000 Empty

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Seq test&lt;/span&gt;
let rec flattenToSeq tree &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    match tree with
    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Empty -&amp;gt; Seq.empty
    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Branch (value, left, right) -&amp;gt; 
        seq { yield value; yield! flattenToSeq left; yield! flattenToSeq right }

tree
|&amp;gt; flattenToSeq
|&amp;gt; Seq.length 

leftSpinedTree
|&amp;gt; flattenToSeq
|&amp;gt; Seq.length 

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// LazyList test&lt;/span&gt;
let rec flattenToLazyList tree &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    match tree with
    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Empty -&amp;gt; LazyList.Empty 
    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Branch (value, left, right) -&amp;gt; 
        lazyList { yield value; yield! flattenToLazyList left; yield! flattenToLazyList right }

tree
|&amp;gt; flattenToLazyList
|&amp;gt; Seq.length 

leftSpinedTree
|&amp;gt; flattenToLazyList
|&amp;gt; Seq.length &lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=62141" width="1" height="1"&gt;</description></item><item><title>'M'agic &amp; LINQ - IT PRO DEV CONNECTIONS</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/12/10/m-agic-amp-linq-it-pro-dev-connections.aspx</link><pubDate>Sat, 11 Dec 2010 01:44:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:61493</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/61493.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=61493</wfw:commentRss><description>&lt;DIV&gt;Αν και καθυστερημένα... θα ήθελα να ευχαριστήσω&amp;nbsp;&lt;FONT class=Apple-style-span size=2&gt;όλους τους φίλους για την παρουσία τους και τα πολύ καλά τους λόγια.&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV&gt;Αν και η παρουσίαση ήταν κυρίως βασισμένη σε live&amp;nbsp;&lt;FONT class=Apple-style-span size=2&gt;hacking...&amp;nbsp;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT class=Apple-style-span size=2&gt;προσπάθησα να σπάσω σε βήματα το refactoring για όποιον θέλει να μελετήσει τον κώδικα.&lt;/FONT&gt;&lt;/DIV&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=61493" width="1" height="1"&gt;</description><enclosure url="https://www.dotnetzone.gr:443/cs/blogs/palladin/attachment/61493.ashx" length="764197" type="application/x-zip-compressed" /></item><item><title>Hughes's list in F#</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/11/13/hughes-s-list-in-f.aspx</link><pubDate>Sun, 14 Nov 2010 04:24:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:60861</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/60861.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=60861</wfw:commentRss><description>&lt;div&gt;Ορίζοντας τις Combine και Zero σε ένα Computation expression μπορούμε&amp;nbsp;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;να έχουμε Monoid comprehensions.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;Πρόσφατα παρατήρησα ότι το Monadic Append στα γνωστά (Array, List, Seq) είναι σχετικά αργό.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#time
[ &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; i &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; {1..1000000} &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
        yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 2; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 3; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 4; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 5 ]
 
[&lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; i &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; {1..1000000} &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
        yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 2; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 3; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 4; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 5 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt;]
 
 
seq { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; i &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; {1..1000000} &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
        yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 2; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 3; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 4; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 5 } |&amp;gt; Seq.iter ignore&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Μια τεχνική για να έχουμε γρήγορο list append είναι να αξιοποιήσουμε&amp;nbsp;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;μια παλαιά ιδέα από έναν &lt;a href="http://www.chalmers.se/cse/EN/people/hughes-john"&gt;guru&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;type FuncList&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 'a list -&amp;gt; 'a list

type FuncListBuilder() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    member self.Combine (first : FuncList&amp;lt;'a&amp;gt;, second : FuncList&amp;lt;'a&amp;gt;) : FuncList&amp;lt;'a&amp;gt;  &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (first &amp;lt;&amp;lt; second) 
    member self.Zero() : FuncList&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; id
    member self.Yield (value : 'a) : FuncList&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; fun tail -&amp;gt; value :: tail
    member self.YieldFrom (value : FuncList&amp;lt;'a&amp;gt;) : FuncList&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; value
    member self.For (list : FuncList&amp;lt;'a&amp;gt;, f : 'a -&amp;gt; FuncList&amp;lt;'b&amp;gt;) : FuncList&amp;lt;'b&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        fun tail -&amp;gt; [] |&amp;gt; list |&amp;gt; List.map f |&amp;gt; List.fold (fun acc value -&amp;gt; self.Combine(acc, value)) (self.Zero()) &amp;lt;| tail
    member self.Delay ( f : unit -&amp;gt; FuncList&amp;lt;'a&amp;gt;) : FuncList&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f ()
 
let funcList &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; FuncListBuilder()
let toFuncList (list : 'a list) : FuncList&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; list |&amp;gt; List.fold (fun acc value -&amp;gt; funcList { yield! acc; yield value }) id


 
[] |&amp;gt; funcList  { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; i &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; toFuncList [1..1000000] &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
                    yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 2; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 3; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 4; yield i &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 5 }&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Για περισσότερες πληροφορίες:&amp;nbsp;&lt;span class="Apple-style-span" style="font-family:arial, sans-serif;font-size:15.2778px;border-collapse:collapse;"&gt;&lt;a href="http://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/lists.pdf" target="_blank"&gt;http://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/lists.pdf&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=60861" width="1" height="1"&gt;</description></item><item><title>Looking for Hacker</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/10/25/looking-for-hacker.aspx</link><pubDate>Mon, 25 Oct 2010 21:50:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:60673</guid><dc:creator>PALLADIN</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/60673.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=60673</wfw:commentRss><description>&lt;p class="MsoNormal"&gt;H ομάδα μου και εγώ προσωπικά αναζητούμε F# hacker. Για περισσότερες πληροφορίες στείλτε μου PM.&lt;/p&gt;&lt;p class="MsoNormal"&gt;"Είμαστε μια μικρή ομάδα έμπειρων F# προγραμματιστών και
αναζητούμε νεαρό ταλαντούχο hacker για να δουλέψει μαζί μας σε ένα πολύ
ενδιαφέρον και φιλόδοξο F# project. Αν και οι γνώσεις γύρω από F# και .Net δεν
είναι απαραίτητες, απαιτείται τουλάχιστον σχετική εμπειρία σε κάποια functional
γλώσσα (FP C#, FP Javascript, Lisp family, ML family, Haskell, Erlang) καθώς
και όρεξη και πάθος για applied functional programming.&lt;span class="Apple-style-span" style="font-family:'Segoe UI', sans-serif;font-size:13.3333px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;Για&amp;nbsp;περισσότερες&amp;nbsp;πληροφορίες και για αποστολή βιογραφικών &lt;span style="mso-ansi-language:EN-US;"&gt;nessos&lt;/span&gt;@&lt;span style="mso-ansi-language:EN-US;"&gt;nessos&lt;/span&gt;.&lt;span style="mso-ansi-language:EN-US;"&gt;gr"&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=60673" width="1" height="1"&gt;</description></item><item><title>Steps in Scala</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/10/13/steps-in-scala.aspx</link><pubDate>Wed, 13 Oct 2010 07:15:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:60564</guid><dc:creator>PALLADIN</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/60564.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=60564</wfw:commentRss><description>&lt;div&gt;Θα ήθελα να δώσω πολλά μπράβο στους συγγραφείς του&lt;a href="http://www.cambridge.org/uk/catalogue/catalogue.asp?isbn=9780521747585"&gt; Steps Scala&lt;/a&gt; (Λοβέρδος, Συρόπουλος)&amp;nbsp;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;για το θεωρητικό content που συμπεριέλαβαν.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ιδιαίτερη μνεία πρέπει να γίνει για τo κεφαλαιο "Higher Order Polymorphism",&amp;nbsp;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;που ασχολείται με τις ιδέες&lt;/span&gt;&lt;/div&gt;&lt;div&gt;του κλασικού πλέον &lt;a href="http://research.microsoft.com/en-us/um/people/emeijer/Papers/fpca91.pdf"&gt;Banana paper&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Έχοντας διαβάσει σχεδόν όλα τα βιβλία που έχουν βγει για Scala, μπορώ να&amp;nbsp;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;πω με σιγουριά ότι το συγκεκριμένο βιβλίο ξεχωρίζει.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:13.1944px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;img width="150" height="200" src="http://www.scala-lang.org/sites/default/files/book_icons/steps-v2.gif"&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=60564" width="1" height="1"&gt;</description></item><item><title>Monadic Retry</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/10/10/monadic-retry.aspx</link><pubDate>Mon, 11 Oct 2010 01:41:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:60535</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/60535.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=60535</wfw:commentRss><description>&lt;div&gt;Πολλές φορες έχουμε σενάρια που θα θέλαμε να εφαρμοσουμε συγκεκριμενα retry policies σε error prone computations.&lt;/div&gt;&lt;div&gt;Τα σενάρια αυτά εμφανίζονται αρκετά συχνά και κυρίως σε cloud computations.&lt;/div&gt;&lt;div&gt;Στο Azure για παράδειγμα, υπάρχουν και συγκεκριμένα APIs που παίζουν με Retry Policies.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το παρακάτω monad είναι μια έμπνευση που είχα στο να κάνω combine το&lt;/div&gt;&lt;div&gt;reader monad (για το propagation του policy) μαζί με το exception monad έτσι ώστε να δομήσω ένα retry monad.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;open System
open System.Threading
 
type ShouldRetry &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ShouldRetry of (RetryCount &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; LastException -&amp;gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;bool&lt;/span&gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; RetryDelay)
and RetryCount &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;
and LastException &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; exn
and RetryDelay &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; TimeSpan
type RetryPolicy &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; RetryPolicy of ShouldRetry
   
type RetryPolicies() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; member NoRetry () : RetryPolicy &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        RetryPolicy( ShouldRetry (fun (retryCount, _) -&amp;gt; (retryCount &amp;lt; 1, TimeSpan.Zero)) )
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; member Retry (currentRetryCount : &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; , intervalBewteenRetries : RetryDelay) : RetryPolicy &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        RetryPolicy( ShouldRetry (fun (retryCount, _) -&amp;gt; (currentRetryCount &amp;lt; retryCount, intervalBewteenRetries)))
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; member Retry (currentRetryCount : &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;) : RetryPolicy &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        RetryPolicies.Retry(currentRetryCount, TimeSpan.Zero)
 
type RetryResult&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; RetrySuccess of 'a
    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; RetryFailure of exn
   
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Reader + Exception Monad DataType&lt;/span&gt;
type Retry&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Retry of (RetryPolicy -&amp;gt; RetryResult&amp;lt;'a&amp;gt;)
 
type RetryBuilder() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    member self.Return (value : 'a) : Retry&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Retry (fun retryPolicy -&amp;gt; RetrySuccess value)
 
    member self.Bind (retry : Retry&amp;lt;'a&amp;gt;, bindFunc : 'a -&amp;gt; Retry&amp;lt;'b&amp;gt;) : Retry&amp;lt;'b&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        Retry (fun retryPolicy -&amp;gt;
            let (Retry retryFunc) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retry
            match retryFunc retryPolicy with
            &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; RetrySuccess value -&amp;gt;
                let (Retry retryFunc') &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; bindFunc value
                retryFunc' retryPolicy
            &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; RetryFailure exn -&amp;gt; RetryFailure exn )
 
    member self.Delay (f : unit -&amp;gt; Retry&amp;lt;'a&amp;gt;) : Retry&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        Retry (fun retryPolicy -&amp;gt;
            let mutable resultCell : option&amp;lt;RetryResult&amp;lt;'a&amp;gt;&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; None
            let mutable lastExceptionCell : exn &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;null&lt;/span&gt;
            let (RetryPolicy(ShouldRetry shouldRetry)) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retryPolicy
            let mutable canRetryCell : &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;bool&lt;/span&gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;
            let mutable currentRetryCountCell : &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;while&lt;/span&gt; canRetryCell &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
                &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;try&lt;/span&gt;
                    let (Retry retryFunc) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f ()
                    let result &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retryFunc retryPolicy
                    resultCell &amp;lt;- Some result
                    canRetryCell &amp;lt;- &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;
                with e -&amp;gt;
                    lastExceptionCell &amp;lt;- e
                    currentRetryCountCell &amp;lt;- 1 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; currentRetryCountCell
                    match shouldRetry(currentRetryCountCell, lastExceptionCell) with
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; (&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;, retryDelay) -&amp;gt;
                        canRetryCell &amp;lt;- &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;
                        Thread.Sleep(retryDelay)
                    &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; (&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;, _) -&amp;gt; canRetryCell &amp;lt;- &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;
 
            match resultCell with
            &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Some result -&amp;gt; result
            &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; None -&amp;gt; RetryFailure lastExceptionCell )
 
[&amp;lt;AutoOpen&amp;gt;]
module Retry &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    let retry &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; RetryBuilder()
    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// override default policy&lt;/span&gt;
    let retryWithPolicy (retryPolicy : RetryPolicy) (retry : Retry&amp;lt;'a&amp;gt;) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        Retry (fun _ -&amp;gt; let (Retry retryFunc) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retry &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; retryFunc retryPolicy)

    let run (retry : Retry&amp;lt;'a&amp;gt;) (retryPolicy : RetryPolicy) : RetryResult&amp;lt;'a&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
        let (Retry retryFunc) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retry
        retryFunc retryPolicy

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// DivByzero example&lt;/span&gt;
let rnd &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; System.Random()
let example &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
    retry {
        let! a &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retry { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 1 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; rnd.Next(0, 2) }
        let! b &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retry { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 2 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; rnd.Next(0, 2) }
        &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// override default policy&lt;/span&gt;
        let! c &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; retryWithPolicy (RetryPolicies.NoRetry()) (retry { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 3 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; rnd.Next(0, 2) })

        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; a &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; b &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; c
    }&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="background-color:transparent;"&gt;&lt;font class="Apple-style-span" face="'Courier New'" size="3"&gt;&lt;span class="Apple-style-span" style="font-size:13px;"&gt;run example (RetryPolicies.Retry 1)&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=60535" width="1" height="1"&gt;</description></item><item><title>Monadic Memoization in F# (The Continuation)</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/09/05/monadic-memoization-in-f-the-continuation.aspx</link><pubDate>Mon, 06 Sep 2010 04:13:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59883</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/59883.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=59883</wfw:commentRss><description>&lt;div&gt;Συνεχίζοντας τις περιπέτειες μου στον χώρο του monadic memoization, αποφάσισα να&amp;nbsp;&lt;/div&gt;&lt;div&gt;εμπλουτίσω την προηγουμενη προσπάθειά μου με το Continuation Monad, έτσι ώστε να έχω tail&amp;nbsp;&lt;span class="Apple-style-span" style="font-size:13.3333px;"&gt;calls και να αποφύγω "περίεργα" stack overflows.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:13.3333px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Η ιδέα είναι να συνδυάσω το State Monad με το Continuation Monad (StateT Monad Transformer) και ως "δια μαγείας" όλα να δουλέψουν.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;type StateContMonad&amp;lt;'s, 'a, 'r&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateContMonad of ('s -&amp;gt; ('s -&amp;gt; 'a -&amp;gt; 'r) -&amp;gt; 'r)
type StateContBuilder() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    member self.Return value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateContMonad (fun state k -&amp;gt; k state value)
    member self.Bind(StateContMonad contStateMonad, f) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateContMonad (fun state k -&amp;gt; contStateMonad state (fun state' value -&amp;gt; let (StateContMonad contMonad') &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f value &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; contMonad' state' k))
    member self.Delay( f : unit -&amp;gt; StateContMonad&amp;lt;'s, 'a, 'r&amp;gt; ) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateContMonad (fun state k -&amp;gt; let (StateContMonad contStateMonad) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f () &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; contStateMonad state k)
 
let memo &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; StateContBuilder()
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val Y : (('a -&amp;gt; 'b) -&amp;gt; 'a -&amp;gt; 'b) -&amp;gt; 'a -&amp;gt; 'b&lt;/span&gt;
let rec Y f value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f (Y f) value
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val check : 'a -&amp;gt; StateContMonad&amp;lt;Map&amp;lt;'a,'r&amp;gt;,'r option,'r&amp;gt; when 'a : comparison&lt;/span&gt;
let check (value : 'a) : StateContMonad&amp;lt;Map&amp;lt;'a, 'r&amp;gt;, option&amp;lt;'r&amp;gt;, 'r&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateContMonad (fun map k -&amp;gt; k map (Map.tryFind value map))
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val store : 'a * 'r -&amp;gt; StateContMonad&amp;lt;Map&amp;lt;'a,'r&amp;gt;,unit,'r&amp;gt; when 'a : comparison&lt;/span&gt;
let store (argument : 'a, result : 'r) : StateContMonad&amp;lt;Map&amp;lt;'a, 'r&amp;gt;, unit, 'r&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateContMonad (fun map k -&amp;gt; k (Map.add argument result map) ())
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val memoize : ('a -&amp;gt; StateContMonad&amp;lt;Map&amp;lt;'a,'b&amp;gt;,'b,'b&amp;gt;) -&amp;gt; 'a -&amp;gt; StateContMonad&amp;lt;Map&amp;lt;'a,'b&amp;gt;,'b,'b&amp;gt; when 'a : comparison&lt;/span&gt;
let memoize f argument &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    memo {
        let! checkResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; check argument
        match checkResult with
        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Some result -&amp;gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; result
        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; None -&amp;gt;
            let! result &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f argument
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;! store (argument, result)
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; result
    }
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val execute : (('a -&amp;gt; StateContMonad&amp;lt;Map&amp;lt;'a,'b&amp;gt;,'b,'b&amp;gt;) -&amp;gt; 'a -&amp;gt; StateContMonad&amp;lt;Map&amp;lt;'a,'b&amp;gt;,'b,'b&amp;gt;) -&amp;gt; 'a -&amp;gt; 'b when 'a : comparison&lt;/span&gt;
let execute f n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; let (StateContMonad contStateMonad) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Y (memoize &amp;lt;&amp;lt; f) n &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; contStateMonad Map.empty (fun _ value -&amp;gt; value)
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val big : int -&amp;gt; BigInteger&lt;/span&gt;
let big (value : &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; System.Numerics.BigInteger(value)
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val fib : (BigInteger -&amp;gt; StateContMonad&amp;lt;'a,BigInteger,'b&amp;gt;) -&amp;gt; BigInteger -&amp;gt; StateContMonad&amp;lt;'a,BigInteger,'b&amp;gt;&lt;/span&gt;
let fib f n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; big 0 then memo { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; big 0 }
    elif n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; big 1 then memo { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; big 1 }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;
        memo {
            let! nMinus1Fib &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; big 1)
            let! nMinus2Fib &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; big 2)
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; nMinus1Fib &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; nMinus2Fib
        }
 
execute fib (big 100000)&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=59883" width="1" height="1"&gt;</description></item><item><title>Monadic Memoization in F#</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/08/16/monadic-memoization-in-f.aspx</link><pubDate>Tue, 17 Aug 2010 05:38:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59672</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/59672.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=59672</wfw:commentRss><description>&lt;div&gt;Πρόσφατα χρειάστηκε να χρησιμοποιήσω μια memoization συνάρτηση για ένα πρόβλημα δυναμικού προγραμματισμού.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:13.3333px;"&gt;Υλοποιώντας την κλασσική τεχνική χρειαζόμαστε μια συνάρτηση σαν την παρακάτω:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;let memoize f &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
	let cache &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Dictionary&amp;lt;_, _&amp;gt;()	
	(fun x -&amp;gt; match cache.TryGetValue(x) with
                  &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;, y -&amp;gt; y
	          &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; _       -&amp;gt; let v &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f(x)
                                       cache.Add(x, v)
                                       v)&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το πρόβλημα με την παραπάνω συνάρτηση είναι ότι χρειαζόμαστε "κριμένα" side effects.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:13.3333px;"&gt;Μετά από μελέτη κατέληξα ότι η pure functional λύση θα περιελάμβανε τον Y combinator και το State Monad.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Η κεντρική ιδέα είναι να μετατρέψουμε μια συνάρτηση από a -&amp;gt; b σε a -&amp;gt; m b,&lt;/div&gt;&lt;div&gt;plus ότι χρειαζόμαστε να κάνουμε abstract και τις αναδρομικές κλήσεις για να εισάγουμε τους ελεγχους στα arguments.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;My F# solution:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;type StateMonad&amp;lt;'a, 's&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateMonad of ('s -&amp;gt; ('a &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt; 's))
 
type StateBuilder() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    member self.Return value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateMonad (fun state -&amp;gt; (value, state))
    member self.Bind (StateMonad stateMonad, f) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateMonad (fun state -&amp;gt; let value, state' &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; stateMonad state &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; let (StateMonad stateMonad') &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f value &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; stateMonad' state')
 
let memo &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; StateBuilder()
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val Y : (('a -&amp;gt; 'b) -&amp;gt; 'a -&amp;gt; 'b) -&amp;gt; 'a -&amp;gt; 'b&lt;/span&gt;
let rec Y f value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f (Y f) value
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val check : 'a -&amp;gt; StateMonad&amp;lt;'r option,Map&amp;lt;'a,'r&amp;gt;&amp;gt; when 'a : comparison&lt;/span&gt;
let check (value : 'a) : StateMonad&amp;lt;option&amp;lt;'r&amp;gt;, Map&amp;lt;'a, 'r&amp;gt;&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateMonad (fun map -&amp;gt; (Map.tryFind value map, map))
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val store : 'a * 'r -&amp;gt; StateMonad&amp;lt;unit,Map&amp;lt;'a,'r&amp;gt;&amp;gt; when 'a : comparison&lt;/span&gt;
let store (argument : 'a, result : 'r) : StateMonad&amp;lt;unit, Map&amp;lt;'a, 'r&amp;gt;&amp;gt; &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; StateMonad (fun map -&amp;gt; ((), Map.add argument result map))
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val memoize :('a -&amp;gt; StateMonad&amp;lt;'b,Map&amp;lt;'a,'b&amp;gt;&amp;gt;) -&amp;gt; 'a -&amp;gt; StateMonad&amp;lt;'b,Map&amp;lt;'a,'b&amp;gt;&amp;gt; when 'a : comparison&lt;/span&gt;
let memoize f argument &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    memo {
        let! checkResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; check argument
        match checkResult with
        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; Some result -&amp;gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; result
        &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;|&lt;/span&gt; None -&amp;gt;
            let! result &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f argument
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;! store (argument, result)
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; result
    }
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val execute : (('a -&amp;gt; StateMonad&amp;lt;'b,Map&amp;lt;'a,'b&amp;gt;&amp;gt;) -&amp;gt; 'a -&amp;gt; StateMonad&amp;lt;'b,Map&amp;lt;'a,'b&amp;gt;&amp;gt;) -&amp;gt; 'a -&amp;gt; 'b when 'a : comparison&lt;/span&gt;
let execute f n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; let (StateMonad stateMonad) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Y (memoize &amp;lt;&amp;lt; f) n &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; fst (stateMonad Map.empty)
 
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// val fib : (int -&amp;gt; StateMonad&amp;lt;int,'a&amp;gt;) -&amp;gt; int -&amp;gt; StateMonad&amp;lt;int,'a&amp;gt;&lt;/span&gt;
let fib f n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0 then memo { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0 }
    elif n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 1 then memo { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 1 }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;
        memo {
            let! nMinus1Fib &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; 1)
            let! nMinus2Fib &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f (n &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; 2)
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; nMinus1Fib &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; nMinus2Fib
        }
   
execute fib 1000&lt;/span&gt;&lt;/pre&gt;References:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:Tahoma, Arial, Helvetica;font-size:10px;"&gt;&lt;a href="http://www.cs.utexas.edu/~wcook/Drafts/2006/MemoMixins.pdf"&gt;http://www.cs.utexas.edu/~wcook/Drafts/2006/MemoMixins.pdf&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:Tahoma, Arial, Helvetica;font-size:10px;"&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.3065"&gt;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.3065&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=59672" width="1" height="1"&gt;</description></item><item><title>Clojure's Atoms in F#</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/07/11/clojure-s-atoms-in-f.aspx</link><pubDate>Mon, 12 Jul 2010 02:49:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59421</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/59421.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=59421</wfw:commentRss><description>&lt;div&gt;Μελετώντας την &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, την προσοχή μου τράβηξε ένα απλό αλλά πολύ χρήσιμο construct, το &lt;a href="http://clojure.org/atoms"&gt;Atom&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Το Atom φαίνεται να είναι το πάντρεμα των ref cells της ML με lock free &lt;a href="http://en.wikipedia.org/wiki/Compare-and-swap"&gt;CAS&lt;/a&gt; concurrency semantics.&lt;/div&gt;&lt;div&gt;Επειδή τέτοια constructs είναι πολύ χρήσιμα στην F#, σκέφτηκα να υλοποιήσω κάτι ανάλογο.&lt;/div&gt;&lt;div&gt;My attempt:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;type Atom&amp;lt;'a when 'a : not &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;struct&lt;/span&gt;&amp;gt;(value : 'a) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    let refCell &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ref&lt;/span&gt; value
    
    let rec swap f &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
        let currentValue &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; !refCell
        let result &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Interlocked.CompareExchange&amp;lt;'a&amp;gt;(refCell, f currentValue, currentValue)
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; obj.ReferenceEquals(result, currentValue) then ()
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; Thread.SpinWait 20; swap f
        
    member self.Value with get() &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; !refCell
    member self.Swap (f : 'a -&amp;gt; 'a) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; swap f
        
    

let atom value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Atom&amp;lt;_&amp;gt;(value)
    
let (!) (atom : Atom&amp;lt;_&amp;gt;) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;  
    atom.Value
    
let swap (atom : Atom&amp;lt;_&amp;gt;) (f : _ -&amp;gt; _) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;
    atom.Swap f&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;Και ως παράδειγμα χρήσης, σκέφτηκα έναν απλό multithreaded counter.&lt;/div&gt;&lt;div&gt;(Σημείωση: βάζω το int μέσα στο lambda επειδή πρέπει να δώσω στο Atom ένα reference type)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;let counter &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; atom (fun () -&amp;gt; 0)

let listOfIncrementAsync &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; [ &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; _ &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; [1..1000000] -&amp;gt; async { swap counter (fun f -&amp;gt; (fun result () -&amp;gt; result &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; 1) &amp;lt;| f()) } ]

listOfIncrementAsync |&amp;gt; Async.Parallel |&amp;gt; Async.Run |&amp;gt; ignore 

printfn &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"%d"&lt;/span&gt; ((!counter)()) //&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'Courier New';font-size:11px;"&gt;1000000&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=59421" width="1" height="1"&gt;</description></item><item><title>F# is out there</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/06/13/f-is-out-there.aspx</link><pubDate>Mon, 14 Jun 2010 01:59:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59104</guid><dc:creator>PALLADIN</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/59104.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=59104</wfw:commentRss><description>&lt;div&gt;Εδώ και πολλά χρονια ονειρευόμουν την μέρα που κάποια απόγονος της ML θα καταφέρει να σπάσει τα ακαδημαϊκά δεσμά της και να αποκτήσει μια ευρύτερη πιο γενική αντιμετώπιση.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το όνειρο αυτό έγινε πραγματικότητα (υπό μια έννοια)!!!&amp;nbsp;&lt;/div&gt;&lt;div&gt;Η F# είναι πλέον γεγονός και βρίσκεται εγκατεστημένη με κάθε VS 2010.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:arial, sans-serif;font-size:small;line-height:15px;"&gt;&lt;em style="font-style:normal;"&gt;Ήδη&lt;/em&gt;&lt;/span&gt;&amp;nbsp;στην εταιρία μου, κλείνουμε μια εβδομάδα λειτουργίας ενός&amp;nbsp;απαιτητικού production server που τρέχει mission critical&amp;nbsp;components γραμμένα σε F#.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Όσοι φίλοι αισθάνονται ότι πρέπει να υπάρχει κάτι περισσότερο από τα συνηθισμένα "{};++", τότε&amp;nbsp;μπορούν να δώσουν μια ευκαιρία σε&amp;nbsp;κάτι διαφορετικό.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Μετά από ένα σημείο θα αρχίσουν να βλέπουν τον&amp;nbsp;κώδικα με άλλα μάτια... Σαν τον Neo στο τέλος του πρώτου Matrix &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-15.gif" alt="Geeked" /&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Resources:&lt;/div&gt;&lt;div&gt;&lt;div&gt;Use case:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.microsoft.com/casestudies/case_study_detail.aspx?casestudyid=4000005226"&gt;http://www.microsoft.com/casestudies/case_study_detail.aspx?casestudyid=4000005226&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Lectures:&amp;nbsp;(Όσοι φίλοι παρακολουθήσουν τα μαθήματα και έχουν ερωτήσεις - απορίες, μπορούν να μου στείλουν ένα&amp;nbsp;μήνυμα και θα είναι πραγματικά χαρά μου να βοηθήσω)&lt;/div&gt;&lt;div&gt;&lt;a href="http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-1-of-3/"&gt;http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-1-of-3/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-2-of-3/"&gt;http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-2-of-3/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-3-of-3/"&gt;http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-3-of-3/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=59104" width="1" height="1"&gt;</description></item><item><title>Α programming puzzle: My solution</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/06/07/programming-puzzle-my-solution.aspx</link><pubDate>Mon, 07 Jun 2010 19:45:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59014</guid><dc:creator>PALLADIN</dc:creator><slash:comments>9</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/59014.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=59014</wfw:commentRss><description>Η λύση που έστειλα είναι η Solution2 του darklynx...&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Thunk&amp;lt;T&amp;gt;
	{
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;private&lt;/span&gt; Func&amp;lt;T&amp;gt; func;

		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; T Value
		{
			get { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; func(); }
		}

		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; Thunk(Func&amp;lt;T&amp;gt; computeFunc)
		{
			&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.func &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; () =&amp;gt; { func &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ((Func&amp;lt;T, Func&amp;lt;T&amp;gt;&amp;gt;)(value =&amp;gt; () =&amp;gt; value))(computeFunc()); &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; func(); };
		}
	}&lt;/span&gt;&lt;/pre&gt;Η τεχνική αυτή μοιάζει λίγο με &lt;a href="http://www.codeproject.com/kb/dotnet/ThereAndBackAgain.aspx"&gt;Jit thunks&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Happy hacking.&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=59014" width="1" height="1"&gt;</description></item><item><title>Α programming puzzle</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/06/06/programming-puzzle.aspx</link><pubDate>Mon, 07 Jun 2010 01:30:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58991</guid><dc:creator>PALLADIN</dc:creator><slash:comments>10</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/58991.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=58991</wfw:commentRss><description>&lt;div&gt;Πριν από λίγες μέρες, ένας φίλος μου έστειλε ένα programming puzzle που του τέθηκε&amp;nbsp;κατά την διάρκεια ενός job interview.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το σκέφτηκα για λίγο και του έστειλα μια πρόχειρη λύση.&lt;/div&gt;&lt;div&gt;Με το που είδε τον κώδικα που του έστειλα, μου απάντησε ότι αποκλείεται να είχαν κάτι τέτοιο στο μυαλό τους.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Επειδή είμαι περίεργος να δω και άλλες ιδέες για το πρόβλημα, όσοι φίλοι&lt;/div&gt;&lt;div&gt;θέλουν, μπορούν να αφήσουν ένα comment με τις ιδέες τους.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Σε επόμενο blog post, θα δώσω την λύση που του έστειλα.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Το puzzle:&lt;/div&gt;&lt;div&gt;Δώστε μια εναλλακτική υλοποίηση της παρακάτω class χωρίς να χρησιμοποιηθεί&lt;/div&gt;&lt;div&gt;κανενός είδους conditional logic construct (if, switch, ()?).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Thunk&amp;lt;T&amp;gt;
{
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;private&lt;/span&gt; T value;
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;bool&lt;/span&gt; flag &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;;
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;private&lt;/span&gt; Func&amp;lt;T&amp;gt; func;

	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; T Value
	{
		get
		{
			&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;(!flag)
			{				
				value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; func();
				flag &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;;
			}
			&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; value;	
		}
	}

	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; Thunk(Func&amp;lt;T&amp;gt; func)
	{
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.func &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; func;
	}
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=58991" width="1" height="1"&gt;</description></item><item><title>Pattern matching in C# (The Scheme way)</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/04/10/pattern-matching-in-c-the-scheme-way.aspx</link><pubDate>Sat, 10 Apr 2010 19:56:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58020</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/58020.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=58020</wfw:commentRss><description>&lt;div&gt;Με αφορμή αυτό το &lt;a href="http://www.dotnetzone.gr/cs/forums/58014/ShowThread.aspx"&gt;thread&lt;/a&gt;, και επειδή ο ξεχασμένος Scheme hacker που κρύβω μέσα μου επαναστάτησε...&amp;nbsp;&lt;/div&gt;&lt;div&gt;σκέφτηκα να συνδυάσω old time classic Scheme hacking και modern C# style API.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;pre&gt;&lt;font class="Apple-style-span" color="#0000FF" face="'Courier New'"&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; PatternMatch
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; Func&amp;lt;Func&amp;lt;TValue, TResult&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt; With&amp;lt;TValue, TResult&amp;gt;(Func&amp;lt;TValue, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;bool&lt;/span&gt;&amp;gt; condition, Func&amp;lt;TValue, TResult&amp;gt; action)
    {
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; With(value =&amp;gt; value, condition, action);
    }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; Func&amp;lt;Func&amp;lt;TValue, TResult&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt; With&amp;lt;TValue, TResult&amp;gt;(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt; Func&amp;lt;Func&amp;lt;TValue, TResult&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt; withFunc, Func&amp;lt;TValue, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;bool&lt;/span&gt;&amp;gt; condition, Func&amp;lt;TValue, TResult&amp;gt; action)
    {
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; continuation =&amp;gt; withFunc(value =&amp;gt; condition(value) ? action(value) : continuation(value));
    }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; Func&amp;lt;TValue, TResult&amp;gt; Else&amp;lt;TValue, TResult&amp;gt;(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt; Func&amp;lt;Func&amp;lt;TValue, TResult&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt; withFunc, Func&amp;lt;TValue, TResult&amp;gt; elseFunc)
    {
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; withFunc(elseFunc);
    }
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/font&gt;&lt;/pre&gt;Example:&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var pattern &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; PatternMatch.With&amp;lt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;string&lt;/span&gt;&amp;gt;(value =&amp;gt; value == 1, value =&amp;gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"One "&lt;/span&gt;)
                              .With(value =&amp;gt; value == 2, value =&amp;gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Two "&lt;/span&gt;)
                              .With(value =&amp;gt; value == 3, value =&amp;gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Three "&lt;/span&gt;)
                              .Else(_ =&amp;gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Else"&lt;/span&gt;);

Console.WriteLine(pattern(1));&lt;/span&gt;&lt;/pre&gt;

&lt;span class="Apple-style-span" style="font-family:Tahoma, Verdana, Arial, Helvetica, sans-serif;white-space:normal;font-size:13px;"&gt;Καλό Σάββατο σε όλους μας.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=58020" width="1" height="1"&gt;</description></item><item><title>Robin Milner (13/1/1934 - 20/3/2010)</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/04/01/robin-milner-13-1-1934-20-3-2010.aspx</link><pubDate>Thu, 01 Apr 2010 21:48:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57926</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/57926.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=57926</wfw:commentRss><description>Η &lt;a href="http://en.wikipedia.org/wiki/ML_programming_language"&gt;ML&lt;/a&gt; είναι μια από τις γλώσσες που άλλαξαν εντελώς τον τρόπο σκέψης μου.&lt;div&gt;&lt;div&gt;Ο &lt;a href="http://en.wikipedia.org/wiki/Robin_Milner"&gt;Robin Milner&lt;/a&gt; είναι ένας από εκείνους τους σπάνιους ανθρώπους, που ανέδειξαν το βάθος, την δύναμη και την ομορφιά στο&amp;nbsp;&lt;/div&gt;&lt;div&gt;αντικείμενο που σήμερα ονομάζουμε Computer Science.&lt;/div&gt;&lt;div&gt;Μια προσωπικότητα larger than life.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/899-RobinMilner.jpg"&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=57926" width="1" height="1"&gt;</description></item><item><title>Reactive Monads</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/02/27/reactive-monads.aspx</link><pubDate>Sat, 27 Feb 2010 22:06:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57356</guid><dc:creator>PALLADIN</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/57356.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=57356</wfw:commentRss><description>&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/9/98/ErikMeijer.jpg" style="width:400px;"&gt;&lt;/div&gt;&lt;div&gt;Το Rx είναι το νέο δημιούργημα του Erik Meijer, και μετά από μήνες ενασχόλησης μαζί του, νομίζω ότι είναι απλά 'a work of genius'.&lt;/div&gt;&lt;div&gt;Αυτό που κάνει είναι να δρα ως compositional glue για events, asynchronous calls &amp;nbsp;και γενικά για push based computations.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Κατεβάστε το από &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;εδώ &lt;/a&gt;και αρχίστε να εξερευνείτε τις δυνατότητές του (You will be amazed).&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ως ένα παράδειγμα της μαγείας του, έγραψα ένα κλασσικό mouse move recording and playback.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre;"&gt;	&lt;/span&gt;    var mouseMoveObservable &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Observable.Merge(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Control[] { &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;, recordButton, stopButton, playButton }
                                                    &lt;span class="Apple-tab-span" style="white-space:pre;"&gt;		&lt;/span&gt;.Select(control =&amp;gt; Observable.FromEvent&amp;lt;MouseEventArgs&amp;gt;(control, &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"MouseMove"&lt;/span&gt;)));

            ReplaySubject&amp;lt;TimeInterval&amp;lt;IEvent&amp;lt;MouseEventArgs&amp;gt;&amp;gt;&amp;gt; replayObservable &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;null&lt;/span&gt;;
            Observable.FromEvent&amp;lt;EventArgs&amp;gt;(recordButton, &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Click"&lt;/span&gt;).ObserveOnWindowsForms().Subscribe(_ =&amp;gt;
            {
                stopButton.Enabled &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;; recordButton.Enabled &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;;
                replayObservable &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; mouseMoveObservable.TimeInterval().Record();
                replayObservable.ObserveOnWindowsForms().Subscribe(time =&amp;gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.Text &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; String.Format(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"{0},{1}"&lt;/span&gt;, time.Value.EventArgs.X, time.Value.EventArgs.Y));
            });

            Observable.FromEvent&amp;lt;EventArgs&amp;gt;(stopButton, &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Click"&lt;/span&gt;).ObserveOnWindowsForms().Subscribe(_ =&amp;gt;
            {
                replayObservable.Dispose();
                stopButton.Enabled &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;; playButton.Enabled &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;;
            });
            
            Observable.FromEvent&amp;lt;EventArgs&amp;gt;(playButton, &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Click"&lt;/span&gt;).ObserveOnWindowsForms().Subscribe(_ =&amp;gt;
            {
                playButton.Enabled &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;false&lt;/span&gt;;
                var playObservable &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; replayObservable.ToEnumerable()
                                     .Aggregate(Observable.Return(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Unit()),
                                                (accObservable, timeMouse) =&amp;gt; accObservable.Delay(timeMouse.Interval)
                                                                                            .ObserveOnWindowsForms()                                                                                            
                                                                                            .Do(__ =&amp;gt; Cursor.Position &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ((Control)timeMouse.Value.Sender).PointToScreen(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Point(timeMouse.Value.EventArgs.X, timeMouse.Value.EventArgs.Y))));
                playObservable.Subscribe(value =&amp;gt; { }, () =&amp;gt; recordButton.Enabled &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;);
            });&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=57356" width="1" height="1"&gt;</description><enclosure url="https://www.dotnetzone.gr:443/cs/blogs/palladin/attachment/57356.ashx" length="15596" type="application/x-zip-compressed" /></item><item><title>LiftM'e' up Scotty</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/02/07/liftm-e-up-scotty.aspx</link><pubDate>Mon, 08 Feb 2010 07:40:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56993</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/56993.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=56993</wfw:commentRss><description>&lt;P&gt;Έχοντας αναπτύξει όλο το απαραίτητο machinery (&lt;A href="http://www.dotnetzone.gr/cs/blogs/palladin/archive/2009/12/20/abstracting-over-m-in-f.aspx"&gt;1&lt;/A&gt;, &lt;A href="http://www.dotnetzone.gr/cs/blogs/palladin/archive/2010/01/17/abstracting-over-m-generic-functions.aspx"&gt;2&lt;/A&gt;), μπορούμε να συνεχίσουμε με την ίδια αφαιρετική διάθεση και να "ανεβάσουμε" στον κόσμο του 'M', &lt;BR&gt;συναρτήσεις με ένα, δυο&amp;nbsp;ή περισσότερα arguments.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// liftM declarations&lt;/SPAN&gt;
let liftM&amp;lt;'M, 'A1, 'R when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt; (m : MonadDef&amp;lt;'M&amp;gt;) (f : 'A1 -&amp;gt; 'R) 
                                               (a : IMonad&amp;lt;'A1, 'M&amp;gt;) : IMonad&amp;lt;'R, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                                               m.Map(f, a)

let liftM2&amp;lt;'M, 'A1, 'A2, 'R when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt; (m : MonadDef&amp;lt;'M&amp;gt;) (f : 'A1 -&amp;gt; 'A2 -&amp;gt; 'R) 
                                                     (a : IMonad&amp;lt;'A1, 'M&amp;gt;) (b : IMonad&amp;lt;'A2, 'M&amp;gt;) : IMonad&amp;lt;'R, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                                                     m.Apply(liftM m f a, b)

let liftM3&amp;lt;'M, 'A1, 'A2, 'A3, 'R when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt; (m : MonadDef&amp;lt;'M&amp;gt;) (f : 'A1 -&amp;gt; 'A2 -&amp;gt; 'A3 -&amp;gt; 'R) 
                                                          (a : IMonad&amp;lt;'A1, 'M&amp;gt;) (b : IMonad&amp;lt;'A2, 'M&amp;gt;) 
                                                          (c : IMonad&amp;lt;'A3, 'M&amp;gt;) : IMonad&amp;lt;'R, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                                                          m.Apply(liftM2 m f a b, c)  

&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;//liftM example&lt;/SPAN&gt;
let result &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; liftM2 listM (&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt;) (listM.OfList [0; 1]) (listM.OfList [0; 2])
printfn &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"%A"&lt;/SPAN&gt; result &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;//[0; 2; 1; 3]&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Haskell inspiration&lt;BR&gt;&lt;A href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html"&gt;http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=56993" width="1" height="1"&gt;</description><enclosure url="https://www.dotnetzone.gr:443/cs/blogs/palladin/attachment/56993.ashx" length="3087" type="application/x-zip-compressed" /></item><item><title>Abstracting over 'M' (generic functions)</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2010/01/17/abstracting-over-m-generic-functions.aspx</link><pubDate>Mon, 18 Jan 2010 04:17:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56469</guid><dc:creator>PALLADIN</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/56469.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=56469</wfw:commentRss><description>&lt;P&gt;(Haskell ideas =&amp;gt; F# (OOP + FP))&lt;/P&gt;
&lt;P&gt;Στην Haskell, επειδή έχουμε higher kind polymorphism, μπορούμε να ορίσουμε κάποιες πολύ χρήσιμες και αρκετά γενικές συναρτήσεις για Monads.&lt;BR&gt;Σκέφτηκα να προσπαθήσω να κάνω κάτι αντίστοιχο σε F# (υλοποιώντας ένα Generic List Monad) και να ορίσω τις κλασσικές sequence, mapM, filterM.&lt;/P&gt;
&lt;P&gt;Ως παράδειγμα της δύναμης που μας προσφέρει η αφαίρεση, μπορούμε να ορίσουμε την συνάρτηση του powerset ως εξής:&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;let powerSet xs &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; listM.FilterM ((fun _ -&amp;gt; listM.OfList [&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;false&lt;/SPAN&gt;; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;true&lt;/SPAN&gt;]), listM.OfList xs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// it's magic&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN class=Apple-style-span style="WORD-SPACING:0px;FONT:medium 'Times New Roman';TEXT-TRANSFORM:none;TEXT-INDENT:0px;WHITE-SPACE:normal;LETTER-SPACING:normal;BORDER-COLLAPSE:separate;orphans:2;widows:2;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"&gt;&lt;SPAN class=Apple-style-span style="FONT-SIZE:13px;FONT-FAMILY:monospace;"&gt;&lt;FONT face=Tahoma color=#000000 size=2&gt;Χρησιμοποιώντας subtype polymorphism και μερικά περιορισμένα downcasts, καταφέραμε να φέρουμε λίγο από το άρωμα και την αίγλη της Haskell στον κόσμο της F#.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN class=Apple-style-span style="WORD-SPACING:0px;FONT:medium 'Times New Roman';TEXT-TRANSFORM:none;TEXT-INDENT:0px;WHITE-SPACE:normal;LETTER-SPACING:normal;BORDER-COLLAPSE:separate;orphans:2;widows:2;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"&gt;&lt;SPAN class=Apple-style-span style="FONT-SIZE:13px;FONT-FAMILY:monospace;"&gt;&lt;FONT face=Tahoma color=#000000 size=2&gt;Happy hacking...&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;module MonadModule &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;//Generic Monad Definition&lt;/SPAN&gt;
    [&amp;lt;AbstractClass&amp;gt;]
    type MonadDef&amp;lt;'M when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt;() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;as&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
         let (&amp;gt;&amp;gt;=) m f &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Bind(m, f)
         let unit v &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Return v
         &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; let listDef &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; ListDef()

         &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; member Return&amp;lt;'T&amp;gt; : 'T -&amp;gt; IMonad&amp;lt;'T,'M&amp;gt; 
         &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; member Bind&amp;lt;'T, 'S&amp;gt; : IMonad&amp;lt;'T,'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;*&lt;/SPAN&gt; ('T -&amp;gt; IMonad&amp;lt;'S,'M&amp;gt;) -&amp;gt; IMonad&amp;lt;'S,'M&amp;gt; 
         &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; member Zero&amp;lt;'T&amp;gt; : unit -&amp;gt; IMonad&amp;lt;'T,'M&amp;gt;
         
         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Delay(f) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; unit () &amp;gt;&amp;gt;= fun () -&amp;gt; f()
         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Combine&amp;lt;'T&amp;gt;(first : IMonad&amp;lt;unit, 'M&amp;gt;, second : IMonad&amp;lt;'T, 'M&amp;gt;) : IMonad&amp;lt;'T, 'M&amp;gt;  &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Then (first, second)

         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Then&amp;lt;'T, 'S&amp;gt;(firstM : IMonad&amp;lt;'T, 'M&amp;gt;, secondM : IMonad&amp;lt;'S, 'M&amp;gt;) : IMonad&amp;lt;'S, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
            firstM &amp;gt;&amp;gt;= fun _ -&amp;gt; secondM

         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Map&amp;lt;'T, 'S&amp;gt;(f : 'T -&amp;gt; 'S, m : IMonad&amp;lt;'T, 'M&amp;gt;) : IMonad&amp;lt;'S, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
            m &amp;gt;&amp;gt;= fun v -&amp;gt; unit (f v)

         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Apply&amp;lt;'T, 'S&amp;gt;(mf : IMonad&amp;lt;'T -&amp;gt; 'S, 'M&amp;gt;, m : IMonad&amp;lt;'T, 'M&amp;gt;) : IMonad&amp;lt;'S, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
            mf &amp;gt;&amp;gt;= fun f -&amp;gt; m &amp;gt;&amp;gt;= fun v -&amp;gt; unit (f v)   

         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Join&amp;lt;'T&amp;gt;(m : IMonad&amp;lt;IMonad&amp;lt;'T, 'M&amp;gt;, 'M&amp;gt;) : IMonad&amp;lt;'T, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
            m &amp;gt;&amp;gt;= id

         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Sequence&amp;lt;'T&amp;gt;(lm : IMonad&amp;lt;IMonad&amp;lt;'T, 'M&amp;gt;, ListDef&amp;gt;) : IMonad&amp;lt;IMonad&amp;lt;'T, ListDef&amp;gt;, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
            match lm :?&amp;gt; _ with
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nil -&amp;gt; unit (Nil :&amp;gt; _)
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Cons (m, ms) -&amp;gt; m &amp;gt;&amp;gt;= fun v -&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Sequence ms &amp;gt;&amp;gt;= fun vs -&amp;gt; unit (listDef.ConsM v vs)
        
         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.MapM&amp;lt;'T, 'S&amp;gt;(f : 'T -&amp;gt; IMonad&amp;lt;'S, 'M&amp;gt;, l : IMonad&amp;lt;'T, ListDef&amp;gt;) : IMonad&amp;lt;IMonad&amp;lt;'S, ListDef&amp;gt;, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;  
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Sequence (listDef.Map ((fun v -&amp;gt; f v), l))

         member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.FilterM&amp;lt;'T&amp;gt;(p : 'T -&amp;gt; IMonad&amp;lt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;bool&lt;/SPAN&gt;, 'M&amp;gt;, l : IMonad&amp;lt;'T, ListDef&amp;gt;) : IMonad&amp;lt;IMonad&amp;lt;'T, ListDef&amp;gt;, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
            match l :?&amp;gt; _ with
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nil -&amp;gt; unit (Nil :&amp;gt; _)
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Cons (x, xs) -&amp;gt; p x &amp;gt;&amp;gt;= fun b -&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.FilterM (p, xs) &amp;gt;&amp;gt;= fun ys -&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;if&lt;/SPAN&gt; b then unit (listDef.ConsM x ys) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;else&lt;/SPAN&gt; unit ys   

    and IMonad&amp;lt;'T,'M when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;interface&lt;/SPAN&gt; end 

    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// List Monad&lt;/SPAN&gt;
    and List&amp;lt;'T&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nil
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Cons of ('T &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;*&lt;/SPAN&gt; List&amp;lt;'T&amp;gt;)
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;interface&lt;/SPAN&gt; IMonad&amp;lt;'T, ListDef&amp;gt;
    and
        ListDef() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
            inherit MonadDef&amp;lt;ListDef&amp;gt;() with
                member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.OfList&amp;lt;'T&amp;gt;(xs : list&amp;lt;'T&amp;gt;) : IMonad&amp;lt;'T, ListDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                    List.foldBack (fun v acc -&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.ConsM v acc) xs &amp;lt;| &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Zero() 

                member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.ConsM (x : 'T) (acc : IMonad&amp;lt;'T, ListDef&amp;gt;) : IMonad&amp;lt;'T, ListDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; Cons (x, acc :?&amp;gt; _) :&amp;gt; _
                 
                member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Foldr&amp;lt;'T, 'S&amp;gt;(f : 'T -&amp;gt; 'S -&amp;gt; 'S, seed : 'S, list : IMonad&amp;lt;'T, ListDef&amp;gt;) : 'S &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                    match list :?&amp;gt; _ with
                    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nil -&amp;gt; seed
                    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Cons (x, xs) -&amp;gt; f x (&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Foldr (f, seed, xs) )

                member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Concat&amp;lt;'T&amp;gt;(first : IMonad&amp;lt;'T, ListDef&amp;gt;, second : IMonad&amp;lt;'T, ListDef&amp;gt;) : IMonad&amp;lt;'T, ListDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Foldr(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.ConsM, second, first)

                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Return&amp;lt;'T&amp;gt;(v : 'T) : IMonad&amp;lt;'T, ListDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                    Cons (v, Nil) :&amp;gt; _ 
          
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Bind&amp;lt;'T,'S&amp;gt;(m : IMonad&amp;lt;'T, ListDef&amp;gt;, f : 'T -&amp;gt; IMonad&amp;lt;'S, ListDef&amp;gt;) : IMonad&amp;lt;'S, ListDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;  
                    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Foldr ((fun x acc -&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Concat (f x, acc)), Nil :&amp;gt; _, m)

                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Zero&amp;lt;'T&amp;gt;() : IMonad&amp;lt;'T, ListDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                    Nil :&amp;gt; _ 
 
    let listM &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; ListDef()

open MonadModule

&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// Maybe Monad&lt;/SPAN&gt;
module MaybeModule &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;

    type Maybe&amp;lt;'T&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nothing 
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Just of 'T 
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;interface&lt;/SPAN&gt; IMonad&amp;lt;'T, MaybeDef&amp;gt; 
    and 
        
        MaybeDef() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
            inherit MonadDef&amp;lt;MaybeDef&amp;gt;() with
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Return&amp;lt;'T&amp;gt;(v : 'T) : IMonad&amp;lt;'T, MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                    Just v :&amp;gt; _ 
      
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Bind&amp;lt;'T,'S&amp;gt;(m : IMonad&amp;lt;'T, MaybeDef&amp;gt;, f : 'T -&amp;gt; IMonad&amp;lt;'S, MaybeDef&amp;gt;) : IMonad&amp;lt;'S, MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                    match m :?&amp;gt; _ with 
                    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nothing -&amp;gt; Nothing :&amp;gt; _ 
                    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Just x  -&amp;gt; f x

                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Zero&amp;lt;'T&amp;gt;() : IMonad&amp;lt;'T, MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                    Nothing :&amp;gt; _
                
                member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Just&amp;lt;'T&amp;gt;(value : 'T) : IMonad&amp;lt;'T, MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                    Just value :&amp;gt; _
                member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Nothing&amp;lt;'T&amp;gt;() : IMonad&amp;lt;'T, MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
                    Nothing :&amp;gt; _
    
    let maybeM &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; MaybeDef()     
 

open MaybeModule


&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;//Examples&lt;/SPAN&gt;

let test &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; listM.OfList [ maybeM.Just 1; maybeM.Just 2 ]
maybeM.Sequence test |&amp;gt; printfn &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"%A"&lt;/SPAN&gt;


let powerSet xs &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; listM.FilterM ((fun _ -&amp;gt; listM.OfList [&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;false&lt;/SPAN&gt;; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;true&lt;/SPAN&gt;]), listM.OfList xs)
powerSet [1..3] |&amp;gt; printfn &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"%A"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=56469" width="1" height="1"&gt;</description></item><item><title>Only for language geeks</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2009/12/27/only-for-language-geeks.aspx</link><pubDate>Sun, 27 Dec 2009 22:03:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56082</guid><dc:creator>PALLADIN</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/56082.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=56082</wfw:commentRss><description>&lt;P&gt;No comment&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://imgur.com/P9RnL.jpg"&gt;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=56082" width="1" height="1"&gt;</description></item><item><title>Abstracting over 'M' (in F#)</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2009/12/20/abstracting-over-m-in-f.aspx</link><pubDate>Sun, 20 Dec 2009 23:53:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:55975</guid><dc:creator>PALLADIN</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/55975.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=55975</wfw:commentRss><description>&lt;P&gt;Μετά από αρκετές αποτυχημένες προσπάθειες, στο να συνδυάσω &lt;A href="http://www.dotnetzone.gr/cs/blogs/palladin/archive/2009/10/25/abstracting-over-m.aspx"&gt;Type constructor polymorphism&lt;/A&gt; και LINQ syntax, αποφάσισα &lt;BR&gt;να δοκιμάσω τις ίδιες ιδέες σε F#.&lt;/P&gt;
&lt;P&gt;Η F# υλοποίηση είναι ακριβώς ίδια με την αντίστοιχη σε C#, με την μονη διαφορα ότι το Monad generalization δουλεύει με το ειδικό &lt;BR&gt;syntax support που μας παρέχουν τα computation expressions.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;[&amp;lt;AbstractClass&amp;gt;]
type MonadDef&amp;lt;'M when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt;() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;as&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
     let (&amp;gt;&amp;gt;=) m f &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Bind(m, f)
     let unit v &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Return v

     &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; member Return&amp;lt;'T&amp;gt; : 'T -&amp;gt; IMonad&amp;lt;'T,'M&amp;gt; 
     &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; member Bind&amp;lt;'T, 'S&amp;gt; : IMonad&amp;lt;'T,'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;*&lt;/SPAN&gt; ('T -&amp;gt; IMonad&amp;lt;'S,'M&amp;gt;) -&amp;gt; IMonad&amp;lt;'S,'M&amp;gt; 
    
     member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Then&amp;lt;'T, 'S&amp;gt;(firstM : IMonad&amp;lt;'T, 'M&amp;gt;, secondM : IMonad&amp;lt;'S, 'M&amp;gt;) : IMonad&amp;lt;'S, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
        firstM &amp;gt;&amp;gt;= fun _ -&amp;gt; secondM

     member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Map&amp;lt;'T, 'S&amp;gt;(f : 'T -&amp;gt; 'S, m : IMonad&amp;lt;'T, 'M&amp;gt;) : IMonad&amp;lt;'S, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
        m &amp;gt;&amp;gt;= fun v -&amp;gt; unit (f v)

     member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Apply&amp;lt;'T, 'S&amp;gt;(mf : IMonad&amp;lt;'T -&amp;gt; 'S, 'M&amp;gt;, m : IMonad&amp;lt;'T, 'M&amp;gt;) : IMonad&amp;lt;'S, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
        mf &amp;gt;&amp;gt;= fun f -&amp;gt; m &amp;gt;&amp;gt;= fun v -&amp;gt; unit (f v)   

     member &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Join&amp;lt;'T&amp;gt;(m : IMonad&amp;lt;IMonad&amp;lt;'T, 'M&amp;gt;, 'M&amp;gt;) : IMonad&amp;lt;'T, 'M&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
        m &amp;gt;&amp;gt;= id

and IMonad&amp;lt;'T,'M when 'M :&amp;gt; MonadDef&amp;lt;'M&amp;gt;&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;interface&lt;/SPAN&gt; end 

type Maybe&amp;lt;'T&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nothing 
    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Just of 'T 
    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;interface&lt;/SPAN&gt; IMonad&amp;lt;'T, MaybeDef&amp;gt; 
and 
    MaybeDef() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
        inherit MonadDef&amp;lt;MaybeDef&amp;gt;() with
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Return&amp;lt;'T&amp;gt;(v : 'T) : IMonad&amp;lt;'T, MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                Just v :&amp;gt; _ 
  
            &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;.Bind&amp;lt;'T,'S&amp;gt;(m : IMonad&amp;lt;'T, MaybeDef&amp;gt;, f : 'T -&amp;gt; IMonad&amp;lt;'S, MaybeDef&amp;gt;) : IMonad&amp;lt;'S,MaybeDef&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
                match m :?&amp;gt; _ with 
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Nothing -&amp;gt; Nothing :&amp;gt; _ 
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Just x  -&amp;gt; f x 


let maybe &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; MaybeDef() 

let toMaybeString a &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 
    maybe { 
        let! v &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; Just a  
        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; v.ToString()
    }

printfn &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"%A"&lt;/SPAN&gt; (toMaybeString 42)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=55975" width="1" height="1"&gt;</description></item><item><title>Διομήδης Σπινέλλης</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2009/11/06/54972.aspx</link><pubDate>Fri, 06 Nov 2009 22:11:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54972</guid><dc:creator>PALLADIN</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/54972.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=54972</wfw:commentRss><description>&lt;P&gt;Πριν πολλά πολλά χρονια... είχα αγοράσει ένα βιβλίο που είχε στο εξώφυλλο ένα ψάρι (the "&lt;A href="http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1257509672&amp;amp;sr=8-1"&gt;fish book&lt;/A&gt;")!!!&lt;BR&gt;Αυτό που βρήκα περίεργο στο βιβλίο δεν ήταν το ψάρι αλλα αυτός ο κώδικας &lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;/* DDS-BASIC interpreter in "C" annotated by Michael Somos 1997 */&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;/* INPUT bug fix 07Sep2005 Somos */&lt;/SPAN&gt;
/* original by Diomidis Spinellis &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/SPAN&gt; 1990 IOCCC
&amp;lt;URL:http:&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;//reality.sgi.com/csp/ioccc/1990/dds.c&amp;gt;&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; O(b,f,u,s,c,a)b(){&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;int&lt;/SPAN&gt; o=f();&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;switch&lt;/SPAN&gt;(*p++){X u:_ o s b();X c:_ o a b();&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;default&lt;/SPAN&gt;:p--;_ o;}}
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; t(e,d,_,C)X e:f=fopen(B+d,_);C;fclose(f)
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; U(y,z)&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt;(p=Q(s,y))*p++=z,*p=' '
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; N &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/SPAN&gt;(i=0;i&amp;lt;11*R;i++)m[ i ]&amp;amp;&amp;amp;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; I &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"%d %s\n"&lt;/SPAN&gt;,i,m[ i ]
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; X ;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;break&lt;/SPAN&gt;;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;case&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; _ &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;return&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#define&lt;/SPAN&gt; R 999
typedef &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;char&lt;/SPAN&gt;*A;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;int&lt;/SPAN&gt;*C,E[R],L[R],M[R],P[R],l,i,j;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;char&lt;/SPAN&gt; B[R],F[2];A m[12*R],malloc
(),p,q,x,y,z,s,d,f,fopen();A Q(s,o)A s,o;{&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/SPAN&gt;(x=s;*x;x++){&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/SPAN&gt;(y=x,z=o;*z&amp;amp;&amp;amp;*y==
*z;y++)z++;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt;(z&amp;gt;o&amp;amp;&amp;amp;!*z)_ x;}_   0;}main(){m[11*R]&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"E"&lt;/SPAN&gt;;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt;(puts(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Ok"&lt;/SPAN&gt;),gets(B)
)&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;switch&lt;/SPAN&gt;(*B){X'R':C=E;l=1;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/SPAN&gt;(i=0;i&amp;lt;R;P[i++]=0);&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt;(l){&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt;(!(s=m[l]))l++;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt;
(!Q(s,&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"\""&lt;/SPAN&gt;)){U(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"&amp;lt;&amp;gt;"&lt;/SPAN&gt;,'#');U(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"&amp;lt;="&lt;/SPAN&gt;,'$');U(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"&amp;gt;="&lt;/SPAN&gt;,'!');}d=B;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt;(*F=*s){*s=='&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"'&amp;amp;&amp;amp;j
++;if(j&amp;amp;1||!Q("&lt;/SPAN&gt; \t&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;",F))*d++=*s;s++;}*d--=j=0;if(B[1]!='=')switch(*B){X'E':l=-1
X'R':B[2]!='M'&amp;amp;&amp;amp;(l=*--C)X'I':B[1]=='N'?gets(p=B),P[*d]=S():(*(q=Q(B,"&lt;/SPAN&gt;TH&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"))=0,p
=B+2,S()&amp;amp;&amp;amp;(p=q+4,l=S()-1))X'P':B[5]=='"&lt;/SPAN&gt;'?*d=0,puts(B+6):(p=B+5,printf(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"%d\n"&lt;/SPAN&gt;,S
()))X'G':p=B+4,B[2]=='S'&amp;amp;&amp;amp;(*C++=l,p++),l=S()-1 X'F':*(q=Q(B,&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"TO"&lt;/SPAN&gt;))=0;p=B+5;P[i
=B[3]]=S();p=q+2;M[ i ]=S();L[ i ]=l X'N':++P[*d]&amp;lt;=M[*d]&amp;amp;&amp;amp;(l=L[*d]);}&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;else&lt;/SPAN&gt; p=B+2,P[
*B]=S();l++;}X'L':N printf(I)X'N':N free(m[ i ]),m[ i ]=0   X'B':_ 0 t('S',5,&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"w"&lt;/SPAN&gt;,N
fprintf(f,I))t('O',4,&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"r"&lt;/SPAN&gt;,&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt;(fgets(B,R,f))(*Q(B,&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"\n"&lt;/SPAN&gt;)=0,G()))X 0:&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;default&lt;/SPAN&gt;:G()
;}_ 0;}G(){l=atoi(B);m[l]&amp;amp;&amp;amp;free(m[l]);(p=Q(B,&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;" "&lt;/SPAN&gt;))?strcpy(m[l]=malloc(strlen(p
)),p+1):(m[l]=0,0);}O(S,J,'&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt;',==,'#',!&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt;)O(J,K,'&amp;lt;',&amp;lt;,'&amp;gt;',&amp;gt;)O(K,V,'$',&amp;lt;=,'!',&amp;gt;=)
O(V,W,'&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/SPAN&gt;',+,'&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;-&lt;/SPAN&gt;',-)O(W,Y,'&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;*&lt;/SPAN&gt;',*,'&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;/&lt;/SPAN&gt;',/)Y(){&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;int&lt;/SPAN&gt; o;_*p=='&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;-&lt;/SPAN&gt;'?p++,-Y():*p&amp;gt;='0'&amp;amp;&amp;amp;*p&amp;lt;=
'9'?strtol(p,&amp;amp;p,0):*p=='('?p++,o=S(),p++,o:P[*p++];}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;FONT size=2 face=Tahoma&gt;Τι θέλει να πει ο ποιητής και ποιος είναι αυτός ο Διομήδης Σπινέλλης,,,μετά από κάποια χρονια έμαθα!!!&lt;BR&gt;Πολλά &lt;A href="http://www.capital.gr/gmessages/showTopic.asp?id=1433722"&gt;συγχαρητήρια&lt;/A&gt; και από εμενα...&lt;BR&gt;Πόσες χώρες έχουν έναν hacker σε τέτοια θέση!!!&lt;/FONT&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=54972" width="1" height="1"&gt;</description></item><item><title>Abstracting over 'M'</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2009/10/25/abstracting-over-m.aspx</link><pubDate>Mon, 26 Oct 2009 00:34:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54710</guid><dc:creator>PALLADIN</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/54710.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=54710</wfw:commentRss><description>&lt;P&gt;Τον τελευταίο καιρό ψάχνω κάποιο φορμαλισμό (σε C#) ώστε να μπορέσω να έχω έναν generic-reusable ορισμό ενός &lt;A href="http://en.wikipedia.org/wiki/Monad_(functional_programming)"&gt;Monad&lt;/A&gt;.&lt;BR&gt;Αυτό που λείπει από τα .Net generics είναι η δυνατότητα να έχω abstraction σε επίπεδο Type Constructor. &lt;/P&gt;
&lt;P&gt;Σαν παράδειγμα της συγκεκριμένης αφαίρεσης, παρουσιάζω τον generic ορισμό ενός Monad μέσα από δυο αγαπημένες μου γλώσσες.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Haskell
&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; Monad m where
  (&amp;gt;&amp;gt;=) :: m a -&amp;gt; (a -&amp;gt; m b) -&amp;gt; m b
  &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; :: a -&amp;gt; m a


Scala
&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; Monad[M[_]] {
	def unit[T](a: T): M[T]
	def bind[T, K](m: M[T], f: T =&amp;gt; M[K]): M[K]
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;FONT face=Tahoma size=2&gt;Μετά από αρκετό πειραματισμό και &lt;A href="http://lambda-the-ultimate.org/node/3629"&gt;μελέτη&lt;/A&gt;, κατέληξα στον παρακάτω κώδικα.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; Monad&amp;lt;T, M&amp;gt; where M : MonadDef&amp;lt;M&amp;gt; { }
	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; MonadDef&amp;lt;M&amp;gt; where M : MonadDef&amp;lt;M&amp;gt;
	{
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; Monad&amp;lt;T, M&amp;gt; Unit&amp;lt;T&amp;gt;(T value);
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; Monad&amp;lt;S, M&amp;gt; Bind&amp;lt;T, S&amp;gt;(Monad&amp;lt;T, M&amp;gt; monad, Func&amp;lt;T, Monad&amp;lt;S, M&amp;gt;&amp;gt; func);

		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; Monad&amp;lt;S, M&amp;gt; Then&amp;lt;T, S&amp;gt;(Monad&amp;lt;T, M&amp;gt; first, Monad&amp;lt;S, M&amp;gt; second)
		{
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; Bind(first, _ =&amp;gt; second);
		}

		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; Monad&amp;lt;S, M&amp;gt; Map&amp;lt;T, S&amp;gt;(Monad&amp;lt;T, M&amp;gt; monad, Func&amp;lt;T, S&amp;gt; f)
		{
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; Bind(monad, value =&amp;gt; Unit(f(value)));
		}

		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; Monad&amp;lt;T, M&amp;gt; Join&amp;lt;T&amp;gt;(Monad&amp;lt;Monad&amp;lt;T, M&amp;gt;, M&amp;gt; monad)
		{
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; Bind(monad, value =&amp;gt; value);
		}
	}
	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// Maybe Monad implementation &lt;/SPAN&gt;
	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; Maybe&amp;lt;T&amp;gt; : Monad&amp;lt;T, MaybeDef&amp;gt;
	{
	}
	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;sealed&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; Just&amp;lt;T&amp;gt; : Maybe&amp;lt;T&amp;gt;
	{
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; T Value { &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;private&lt;/SPAN&gt; set; get; }
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; Just(T value) { Value &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; value; }
	}
	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;sealed&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; Nothing&amp;lt;T&amp;gt; : Maybe&amp;lt;T&amp;gt; { }

	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; MaybeMonadExtensions
	{
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; Maybe&amp;lt;T&amp;gt; ToMaybe&amp;lt;T&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; Monad&amp;lt;T, MaybeDef&amp;gt; monad)
		{
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; (Maybe&amp;lt;T&amp;gt;)monad;
		}
	}

	&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;sealed&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; MaybeDef : MonadDef&amp;lt;MaybeDef&amp;gt;
	{

		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; Monad&amp;lt;T, MaybeDef&amp;gt; Unit&amp;lt;T&amp;gt;(T value)
		{
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; Just&amp;lt;T&amp;gt;(value);
		}

		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;override&lt;/SPAN&gt; Monad&amp;lt;S, MaybeDef&amp;gt; Bind&amp;lt;T, S&amp;gt;(Monad&amp;lt;T, MaybeDef&amp;gt; monad, Func&amp;lt;T, Monad&amp;lt;S, MaybeDef&amp;gt;&amp;gt; f)
		{
			Just&amp;lt;T&amp;gt; just &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; monad &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;as&lt;/SPAN&gt; Just&amp;lt;T&amp;gt;;
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;if&lt;/SPAN&gt; (just !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;)
				&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; f(just.Value);
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;else&lt;/SPAN&gt;
				&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; Nothing&amp;lt;S&amp;gt;();
		}
	}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt;[] args)
	{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var def &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; MaybeDef();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Maybe&amp;lt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt;&amp;gt; result &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; def.Bind(def.Unit(42), value =&amp;gt; def.Unit(value.ToString())).ToMaybe();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=54710" width="1" height="1"&gt;</description></item><item><title>RegEx engine in F#</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2009/09/27/regex-engine-in-f.aspx</link><pubDate>Sun, 27 Sep 2009 21:54:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54018</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/54018.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=54018</wfw:commentRss><description>&lt;P&gt;Ένα από τα πολύ δυνατά χαρακτηριστικά μιας functional γλώσσας, είναι η δυνατότητα να δημιουργούμε internal DSLs κάνοντας compose combinators.&lt;/P&gt;
&lt;P&gt;Ένα τέτοιο παράδειγμα, είναι μια regex engine που έγραψα σε F#.&lt;/P&gt;
&lt;P&gt;Κάποιες βασικές&amp;nbsp; ιδέες&amp;nbsp; της υλοποίησης:&lt;BR&gt;&amp;nbsp;- lazy computations for backtracking&lt;BR&gt;&amp;nbsp;- combinators for regex composition&lt;BR&gt;&amp;nbsp;- parametric polymorphism: Generic "named capture variables" and input sequences &lt;BR&gt;&amp;nbsp;- Unions + Active Patterns: pattern matching and value extraction&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Ακολουθεί ένα sample&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;#r &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"FSharp.PowerPack.dll"&lt;/SPAN&gt;
#load &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"RegEx.fs"&lt;/SPAN&gt;

open System
open RegEx

&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// example from http://www.martinfowler.com/bliki/ComposedRegex.html&lt;/SPAN&gt;

type extractTags &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; NumberOfPoint of &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; NumberOfNights of &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; HotelName of &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt;
let numberOfPoints &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; toInt &amp;gt;&amp;gt; NumberOfPoint
let numberOfNights &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; toInt &amp;gt;&amp;gt; NumberOfNights
let hotelName  &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; toString &amp;gt;&amp;gt; HotelName

let scoreKeyword() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"score"&lt;/SPAN&gt; =&amp;gt; !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; space()
let numberOfPoints &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; digit() |&amp;gt; group numberOfPoints
let forKeyword() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; space() =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"for"&lt;/SPAN&gt; =&amp;gt; space()
let numberOfNights &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; digit() |&amp;gt; group numberOfNights
let nightsAtKeyword() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; spaces() =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"nights"&lt;/SPAN&gt; =&amp;gt; spaces() =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"at"&lt;/SPAN&gt; =&amp;gt; spaces()
let hotelName() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; !&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; any() |&amp;gt; group hotelName

let pattern &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; scoreKeyword() =&amp;gt; numberOfPoints =&amp;gt; forKeyword() =&amp;gt; numberOfNights =&amp;gt; nightsAtKeyword() =&amp;gt; hotelName() =&amp;gt; endOfLine()

let text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; List.reduce (fun acc value -&amp;gt; acc &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"\r\n "&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; value)
              [ &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"score 400 for 2 nights at Minas Tirith Airport"&lt;/SPAN&gt;; 
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"score 500 for 6 nights at Athens Airport"&lt;/SPAN&gt;;
                &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"score 200 for 3 nights at London Airport"&lt;/SPAN&gt; ] &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"\r\n"&lt;/SPAN&gt;

let result &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; patternMatch pattern text

&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// pattern match&lt;/SPAN&gt;
match result with
&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Success ( (NumberOfPoint(points) :: NumberOfNights(nights) :: HotelName(name) :: _) :: _ ) -&amp;gt; printfn &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Points: %d, Nights %d, Hotel name: %s"&lt;/SPAN&gt; points nights name
&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; Failure -&amp;gt; ()

                
let replacePattern &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; function
&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; [NumberOfPoint(points); NumberOfNights(nights); HotelName(name)] -&amp;gt; sprintf &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"score %d for %d nights at %s"&lt;/SPAN&gt; (points &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;*&lt;/SPAN&gt; 2) (nights &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;*&lt;/SPAN&gt; 3) (name &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;+&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;" ok"&lt;/SPAN&gt;)
&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;|&lt;/SPAN&gt; _ -&amp;gt; failwith &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Expected extraction pattern: score {NumberOfPoint} for {NumberOfNights} nights at {HotelName}"&lt;/SPAN&gt;

let replacedResult &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; patternReplace pattern text replacePattern |&amp;gt; Array.of_seq |&amp;gt; (fun (chars : array&amp;lt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;char&lt;/SPAN&gt;&amp;gt;) -&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; String(chars))&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=54018" width="1" height="1"&gt;</description><enclosure url="https://www.dotnetzone.gr:443/cs/blogs/palladin/attachment/54018.ashx" length="5129" type="application/x-zip-compressed" /></item><item><title>letrec</title><link>https://www.dotnetzone.gr:443/cs/blogs/palladin/archive/2009/09/13/letrec.aspx</link><pubDate>Mon, 14 Sep 2009 05:44:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:53698</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/palladin/comments/53698.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/palladin/commentrss.aspx?PostID=53698</wfw:commentRss><description>&lt;P&gt;Ο Bart de smet συνεχίζει την πολύ καλή σειρά από posts, και αυτή την φορα μας παρουσιάζει ένα &lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2009/09/12/taming-your-sequence-s-side-effects-through-ienumerable-let.aspx"&gt;cache Enumerable&lt;/A&gt;, μαζί με έναν "let" binder.&lt;BR&gt;Φυσικά λείπει το αδελφάκι "letrec", όπου έμεινε ως άσκηση για τον αναγνώστη.&lt;BR&gt;(η αφορμή που έψαχνα για να ξυπνήσει Ο old schemer μέσα μου)&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;delegate&lt;/SPAN&gt; Func&amp;lt;A, R&amp;gt; Recursive&amp;lt;A, R&amp;gt;(Recursive&amp;lt;A, R&amp;gt; r);
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; Func&amp;lt;A, R&amp;gt; Y&amp;lt;A, R&amp;gt;(Func&amp;lt;Func&amp;lt;A, R&amp;gt;, Func&amp;lt;A, R&amp;gt;&amp;gt; f)
		{
			Recursive&amp;lt;A, R&amp;gt; rec &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; r =&amp;gt; a =&amp;gt; f(r(r))(a);
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; rec(rec);
		}
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;U&amp;gt; Let&amp;lt;T, U&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;IEnumerable&amp;lt;T&amp;gt;, IEnumerable&amp;lt;U&amp;gt;&amp;gt; function)
		{
			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;using&lt;/SPAN&gt; (var mem &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; MemoizeEnumerable&amp;lt;T&amp;gt;(source))
			{
				&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;foreach&lt;/SPAN&gt; (var item &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;in&lt;/SPAN&gt; function(mem))
					yield &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; item;
			}
		}
		&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;U&amp;gt; LetRec&amp;lt;T, U&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;Func&amp;lt;IEnumerable&amp;lt;T&amp;gt;, IEnumerable&amp;lt;U&amp;gt;&amp;gt;, Func&amp;lt;IEnumerable&amp;lt;T&amp;gt;, IEnumerable&amp;lt;U&amp;gt;&amp;gt;&amp;gt; function)
		{
			Func&amp;lt;Func&amp;lt;IEnumerable&amp;lt;T&amp;gt;, IEnumerable&amp;lt;U&amp;gt;&amp;gt;, Func&amp;lt;IEnumerable&amp;lt;T&amp;gt;, IEnumerable&amp;lt;U&amp;gt;&amp;gt;&amp;gt; letWrap &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;
				f =&amp;gt; x =&amp;gt; Let(x, function(f));

			&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; Y(letWrap)(source);
		}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=53698" width="1" height="1"&gt;</description></item></channel></rss>