<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Planet F#</title>
    <description>Planet F#, contributed by OCaml.cn. 
You're welcome to visit our site, and if you'd like to, please consider to click a few advertisements there to support us (they are fun and indeed relevant :-) </description>
    <link>http://ocaml.cn/</link>
    <docs>http://backend.userland.com/rss</docs>
    <generator>RSS.NET: http://www.rssdotnet.com/</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/planet_fsharp" type="application/rss+xml" /><item>
      <title>From the "Gosh, You Wanted Me to Quote You?" Department...</title>
      <description>&lt;p&gt;
This comment deserves response:
&lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
First of all, if you're quoting my post, blocking out my name, and attacking me behind
my back by calling me "our intrepid troll", you could have shown the decency of linking
back to my original post. Here it is, for those interested in the real discussion: &lt;p&gt;
&lt;a rel="nofollow" target="_blank" href="http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first"&gt;http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Well, frankly, I didn't get your post from your blog, I got it from an email 'zine
(as indicated by the comment "This crossed my Inbox..."), and I didn't really think
that anybody would have any difficulty tracking down where it came from, at least
in terms of the email blast that put it into my Inbox. Coupled with the fact that,
quite honestly, I don't generally make a practice of using peoples' names without
their permission (and my email to the author asking if I could quote the post with
his name attached generated no response), so I blocked out the name. Having said that,
I'm pleased to offer full credit as to its source. &lt;blockquote&gt; &lt;p&gt;
Now, let's review some of your remarks: &lt;p&gt;
"COBOL is (at least) twenty years old, so therefore any use of COBOL must clearly
be as idiotic." &lt;p&gt;
I never talked about COBOL, or any other programming language. I was talking about
old practices that are nowadays considered harmful and seriously damaging. (Like practising
waterfall project management, instead of agile project management.) I don't see how
programming in COBOL could seriously damage a business. Why do you compare COBOL with
lobotomies? I don't understand. I couldn't care less about programming languages.
I care about management practices.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Frankly, the distinction isn't very clear in your post, and even more frankly, to
draw a distinction here is a bit specious. "I didn't mean we should throw away the &lt;em&gt;good&lt;/em&gt; stuff
that's twenty years old, only the &lt;em&gt;bad&lt;/em&gt; stuff!" doesn't seem much like a defense
to me. There are cases where waterfall style development is &lt;em&gt;exactly&lt;/em&gt; the right
thing to do a more agile approach is &lt;em&gt;exactly&lt;/em&gt; the wrong thing to do--the difference,
as I'm fond of saying, lies entirely in the context of the problem. Analogously, there
are cases where keeping an existing COBOL system up and running is the wrong thing
to do, and replacing it with a new system is the right thing to do. It all depends
on context, and for that reason, any dogmatic suggestion otherwise is flawed. &lt;blockquote&gt; &lt;p&gt;
"How can a developer honestly claim to know "what it can be good for", without some
kind of experience to back it?" &lt;p&gt;
I'm talking about gaining knowledge from the experience of others. If I hear 10 experts
advising the same best practice, then I still don't have any experience in that best
practice. I only have knowledge about it. That's how you can apply your knowledge
without your experience.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Leaving aside the notion that there is no such thing as best practices (another favorite
rant of mine), what you're suggesting is that you, the individual, don't necessarily
have to have experience in the topic but others have to, before we can put faith into
it. That's a very different scenario than saying "We don't need no stinkin' experience",
and is still vastly more dangerous than saying, "I have used this, it works." I (and
lots of IT shops, I've found) will vastly prefer the latter to the former. &lt;blockquote&gt; &lt;p&gt;
"Knowledge, apparently, isn't enough--experience still matters" &lt;p&gt;
Yes, I never said experience doesn't matter. I only said it has no value when you
don't have gained the appropriate knowledge (from other sources) on when to apply
it, and when not.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
You said it when you offered up the title, "Knowledge, not Experience". &lt;blockquote&gt; &lt;p&gt;
"buried under all the ludicrous hyperbole, he has a point" &lt;p&gt;
Thanks for agreeing with me.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
You're welcome! :-) Seriously, I think I understand better what you were trying to
say, and it's not the horrendously dangerous comments that I thought you were saying,
so I will apologize here and now for believing you to be a wet-behind-the-ears/lets-let-technology-solve-all-our-problems/dangerous-to-the-extreme
developer that I've run across far too often, particularly in startups. So, please,
will you accept my apology? &lt;blockquote&gt; &lt;p&gt;
"developers, like medical professionals, must ensure they are on top of their game
and spend some time investing in themselves and their knowledge portfolio" &lt;p&gt;
Exactly.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Exactly. :-) &lt;blockquote&gt; &lt;p&gt;
"this doesn't mean that everything you learn is immediately applicable, or even appropriate,
to the situation at hand" &lt;p&gt;
I never said that. You're putting words into my mouth. &lt;p&gt;
My only claim is that you need to KNOW both new and old practices and understand which
ones are good and which ones can be seriously damaging. I simply don't trust people
who are bragging about their experience. What if a manager tells me he's got 15 years
of experience managing developers? If he's a micro-manager I still don't want him.
Because micro-management is considered harmful these days. A manager should KNOW that.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Again, this was precisely the read I picked up out of the post, and my apologies for
the misinterpretation. But I stand by the idea that this is one of those posts that &lt;em&gt;could&lt;/em&gt; be
read in a highly dangerous fashion, and used to promote evil, in the form of "Well,
he runs a company, so therefore he must know what he's doing, and therefore having
any kind of experience isn't really necessary to use something new, so... see, Mr.
CEO boss-of-mine? We're safe! Now get out of my way and let me use Software Factories
to build our next-generation mission-critical core-of-the-company software system,
even though nobody's ever done it before." &lt;p&gt;
To speak to your example for a second, for example: Frankly, there are situations
where a micro-manager is a &lt;em&gt;good&lt;/em&gt; thing. Young, inexperienced developers, for
example, need more hand-holding and mentoring than older, more senior, more experienced
developers do (speaking stereotypically, of course). And, quite honestly, the guy
with 15 years managing developers is &lt;em&gt;far&lt;/em&gt; more likely to know how to manage
developers than the guy who's never managed developers before at all. The former is
the safer bet; not a guarantee, certainly, but often the safer bet, and that's sometimes
the best we can do in this industry. &lt;blockquote&gt; &lt;p&gt;
"And we definitely shouldn't look at anything older than five years ago and equate
it to lobotomies." &lt;p&gt;
I never said that either. Why do you claim that I said this? I don't have a problem
with old techniques. The daily standup meeting is a 80-year old best practice. It
was already used by pilots in the second world war. How could I be against that? It's
fine as it is.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Um... because you used the term "lobotomies" first? And because your title pretty
clearly implies the statement, perhaps? (And let's lose the term "best practice" entirely,
please? There is no such thing--not even the daily standup.) &lt;blockquote&gt; &lt;p&gt;
It's ok you didn't like my article. Sure it's meant to be provocative, and food for
thought. The article got twice as many positive votes than negative votes from DZone
readers. So I guess I'm adding value. But by taking the discussion away from its original
context (both physically and conceptually), and calling me names, you're not adding
any value for anyone.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
I took it in exactly the context it was given--a DZone email blast. I can't help it
if it was taken out of context, because that's how it was handed to me. What's worse,
I can see a development team citing this as an "expert opinion" to their management
as a justification to try untested approaches or technologies, or as inspiration to
a young developer, who reads "knowledge, not experience", and thinks, "Wow, if I know
all the cutting-edge latest stuff, I don't need to have those 10 years of experience
to get that job as a senior application architect." If your article was aimed more
clearly at the development process side of things, then I would wish it had appeared
more clearly in the arena of development processes, and made it more clear that your
aim was to suggest that managers (who aren't real big on reading blogs anyway, I've
sadly found) should be a bit more pragmatic and open-minded about who they hire.
&lt;/p&gt;
&lt;p&gt;
Look, I understand the desire for a provocative title--for me, the author of "The
Vietnam of Computer Science", to cast stones at another author for choosing an eye-catching
title is so far beyond hypocrisy as to move into sheer wild-eyed audacity. But I have
seen, first-hand, how that article has been used to justify the most incredibly asinine
technology decisions, and it moves me now to say "Be careful what you wish for" when
choosing titles that meant to be provocative and food for thought. Sure, your piece
got more positive votes than negative ones. So too, in their day, did articles on
client-server, on CORBA, on Six-Sigma, on the necessity for big up-front design....
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Let me put it to you this way. Assume your child or your wife is sick, and as you
reach the hospital, the admittance nurse offers you a choice of the two doctors on
call. Who do you want more: the doctor who just graduated fresh from medical school
and knows all the latest in holistic and unconventional medicine, or the doctor with
30 years' experience and a solid track record of healthy patients?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c3ad9bf0-39cd-4985-981e-dabc0342dbf2"/&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a rel="nofollow" target="_blank" href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=QQn6w1"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=QQn6w1" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/345428213" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/345428213/From+The+QuotGosh+You+Wanted+Me+To+Quote+Youquot+Department.aspx</link>
      <pubDate>Thu, 24 Jul 2008 20:03:04 GMT</pubDate>
    <feedburner:origLink>http://blogs.tedneward.com/2008/07/25/From+The+QuotGosh+You+Wanted+Me+To+Quote+Youquot+Department.aspx</feedburner:origLink></item>
    <item>
      <title>From the "You Must Be Trolling for Hits" Department...</title>
      <description>&lt;p&gt;
Recently this little gem crossed my Inbox....
&lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
&lt;strong&gt;Professionalism = Knowledge First, Experience Last&lt;/strong&gt;
&lt;br&gt;
By J----- A-----
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Do you trust a doctor with diagnosing your mental problems if the doctor tells you
he's got 20 years of experience? Do you still trust that doctor when he picks up his
tools, and asks you to prepare for a lobotomy?
&lt;/p&gt;
&lt;p&gt;
Would you still be impressed if the doctor had 20 years of experience in carrying
out lobotomies?
&lt;/p&gt;
&lt;p&gt;
I am always skeptic when people tell me they have X years of experience in a certain
field or discipline, like "5 years of experience as a .NET developer", "8 years of
experience as a project manager" or "12 years of experience as a development manager".
It is as if people's professional levels need to be measured in years of practice.
&lt;/p&gt;
&lt;p&gt;
This, of course, is nonsense.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Professionalism is measured by what you are going to do &lt;em&gt;now&lt;/em&gt;...&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Are you going to use some discredited technique from half a century ago?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a .NET developer, going to use Response.Write, because
you've got 5 years of experience doing exactly that?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a project manager, going to create Gantt charts, because
that's what you've been doing for 8 years?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a development manager, going to micro-manage your
team members, as you did in the 12 years before now?
&lt;/p&gt;
&lt;p&gt;
If so, allow me to illustrate the value of your experience...
&lt;/p&gt;
&lt;p&gt;
(Photo of "Zero" signs)
&lt;/p&gt;
&lt;p&gt;
Here's an example of what it means to be a professional:
&lt;/p&gt;
&lt;p&gt;
There's a concept called Kanban making headlines these days in some parts of the agile
community. I honestly and proudly admit that I have no experience at all in applying
Kanban. But that's just a minor inconvenience. Because I have attained the knowledge
of what it is and what it can be good for. And now there are some planning issues
in our organization for which this Kanban-stuff might be the perfect solution. I'm
sure we're going to give it a shot, in a controlled setting, with time allocated for
a pilot and proper evaluations afterwards. That's the way a professional tries to
solve a problem.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Professionals don't match problems with their experiences. They match them
with their knowledge.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Sure, experience is useful. But only when you already have the knowledge in place.
Experience has no value when there's no knowledge to verify that you are applying
the right experience.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Knowledge Comes First, Experience Comes Last&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is my message to anyone who wants to be a professional software developer, a
professional project manager, or a professional development manager. &lt;/p&gt;
&lt;p&gt;
You must gain and apply knowledge first, and experience will help you after that.
Professionals need to know about the latest developments and techniques. &lt;/p&gt;
&lt;p&gt;
They certainly don't bother measuring years of experience.
&lt;/p&gt;
&lt;p&gt;
Are you still practicing lobotomies?
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Um....
&lt;/p&gt;
&lt;p&gt;
Wow.
&lt;/p&gt;
&lt;p&gt;
Let's start with the logical fallacy in the first section. Do I trust a doctor with
diagnosing my mental problems if he tells me he's got 20 years of experience? Generally,
yes, unless I have reasons to doubt this. If the guy picks up a skull-drill and starts
looking for a place to start boring into my skull, sure, I'll start to question his
judgement.... But what does this have to do with anything? I wouldn't trust the guy
if he picked up a chainsaw and started firing &lt;em&gt;it&lt;/em&gt; up, either.
&lt;/p&gt;
&lt;p&gt;
Look, I get the analogy: "Doctor has 20 years of experience using outdated skills",
har har. Very funny, very memorable, and totally inappropriate metaphor for the situation.
To stand here and suggest that developers who aren't using the latest-and-greatest,
so-bleeding-edge-even-saying-the-name-cuts-your-skin tools or languages or technologies
are somehow practicing lobotomies (which, by the way, are still a recommended practice
in certain mental disorder cases, I understand) in order to solve any and all mental-health
issues, is a gross mischaracterization--and the worst form of negligence--I've ever
heard suggested.
&lt;/p&gt;
&lt;p&gt;
And it comes as no surprise that it's coming from the CIO of a consulting company.
(Note to self: here's one more company I don't want anywhere &lt;em&gt;near &lt;/em&gt;my clients'
IT infrastructure.)
&lt;/p&gt;
&lt;p&gt;
Let's take this analogy to its logical next step, shall we?
&lt;/p&gt;
&lt;p&gt;
COBOL is (at least) twenty years old, so therefore any use of COBOL must &lt;em&gt;clearly&lt;/em&gt; be
as idiotic as drilling holes in your skull to let the demons out. So any company currently
using COBOL has no real option other than to immediately upgrade &lt;em&gt;all&lt;/em&gt; of their
currently-running COBOL infrastructure (despite the fact that it's tested, works,
and cashes most of the US banking industry's checks on a daily basis) with something
vastly superior and totally untested (since we don't need experience, just knowlege),
like... oh, I dunno.... how about Ruby? Oh, no, wait, that's at least 10 years old.
Ditto for Java. And let's not even &lt;em&gt;think&lt;/em&gt; about C, Perl, Python....
&lt;/p&gt;
&lt;p&gt;
I know; let's rewrite the entire financial industry's core backbone in Groovy, since
it's only, what, 6 years old at this point? I mean, sure, we'll have to do all this
over again in just four years, since that's when Groovy will turn 10 and thus obviously
begin it's long slide into mediocrity, alongside the "four humors" of medicine and
Aristotle's (completely inaccurate) anatomical depictions, but hey, that's progress,
right? Forget experience, it has &lt;em&gt;no value&lt;/em&gt; compared to the "knowledge" that
comes from reading the documentation on a brand-new language, tool, library, or platform....
&lt;/p&gt;
&lt;p&gt;
What I find most appalling is this part right here:
&lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
I honestly and proudly admit that I have no experience at all in applying Kanban. &lt;em&gt;But
that's just a minor inconvenience. Because I have attained the knowledge of what it
is and what it can be good for.&lt;/em&gt; &lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
How can a developer honestly claim to &lt;em&gt;know&lt;/em&gt; "what it can be good for", without
some kind of experience to back it? (Hell, I'll even accept that you have familiarity
and experience with something vaguely &lt;em&gt;relating&lt;/em&gt; to the thing at hand, if you've
got it--after all, experience in Java makes you a pretty damn good C# developer, in
my mind, and vice versa.) &lt;/p&gt;
&lt;p&gt;
And, to make things even &lt;em&gt;more&lt;/em&gt; interesting, our intrepid troll, having established
the attention-gathering headline, then proceeds to step away from the chasm, by backing
away from this "knowledge-not-experience" position in the same paragraph, just one
sentence later:
&lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
I'm sure we're going to give it a shot, in a controlled setting, with time allocated
for a pilot and proper evaluations afterwards.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Ah... In other words, he and his company are going to experiment with this new technique,
"in a controlled setting, with time allocated for a pilot and proper evaluations afterwards",
in order to gain &lt;em&gt;experience&lt;/em&gt; with the technique and see how it works and how
it doesn't. &lt;/p&gt;
&lt;p&gt;
In other words....
&lt;/p&gt;
&lt;p&gt;
.... experience matters. &lt;/p&gt;
&lt;p&gt;
Knowledge, apparently, isn't enough--experience still matters, and it matters a lot
earlier than his "knowledge first, experience last" mantra seems to imply. Otherwise,
once you "know" something, why not apply it immediately to your mission-critical core?
&lt;/p&gt;
&lt;p&gt;
At the end of the day, buried under all the ludicrous hyperbole, he has a point: developers,
like medical professionals, must ensure they are on top of their game and spend some
time investing in themselves and their knowledge portfolio. Jay Zimmerman takes great
pains to point this out at every No Fluff Just Stuff show, and he's right: those who
spend the time to invest in their own knowledge portfolio, find themselves the last
to be fired and the first to be hired. But this doesn't mean that everything you learn
is immediately applicable, or even appropriate, to the situation at hand. Just because
you learned Groovy last weekend in Austin doesn't mean you have the right--or the
responsibility--to immediately start slipping Groovy in to the production servers.
Groovy has its share of good things, yes, but it's got its share of negative consequences,
too, and you'd better &lt;em&gt;damn&lt;/em&gt; well know what they are before you start betting
the company's future on it. (No, I will not tell you what those negative consequences
are--that's &lt;em&gt;your&lt;/em&gt; job, because what if it turns out I'm wrong, or they don't
apply to your particular situation?) &lt;em&gt;Every&lt;/em&gt; technology, language, library
or tool has a positive/negative profile to it, and if you can't point out the pros
as well as the cons, then you don't understand the technology and you have &lt;em&gt;no&lt;/em&gt; business
using it on anything except maybe a prototype that never leaves your local hard disk.
Too many projects were built with "flavor-of-the-year" tools and technologies, and
a few years later, long after the original "bleeding-edge" developer has gone on to
do a new project with a new "bleeding-edge" technology, the IT guys left to admin
and upkeep the project are struggling to find ways to keep this thing afloat.
&lt;/p&gt;
&lt;p&gt;
If you're languishing at a company that seems to resist anything and everything new,
try this exercise on: go down to the IT guys, and &lt;em&gt;ask&lt;/em&gt; them why they resist.
Ask them to show you a data flow diagram of how information feeds from one system
to another (assuming they even have one). Ask them how many different operating systems
they have, how many different languages were used to create the various software programs
currently running, what tools they have to know when one of those programs fails,
and how many different data formats are currently in use. Then go find the guys currently
maintaining and updating and bug-fixing those current programs, and ask to see the
code. Figure out how long it would take you to rewrite the whole thing, and keep the
company in business while you're at it.
&lt;/p&gt;
&lt;p&gt;
There is a reason "legacy code" exists, and while we shouldn't be afraid to replace
it, we shouldn't be cavalier about tossing it out, either.
&lt;/p&gt;
&lt;p&gt;
And we &lt;em&gt;definitely&lt;/em&gt; shouldn't look at anything older than five years ago and
equate it to lobotomies. COBOL had some good ideas that still echo through the industry
today, and Groovy and Scala and Ruby and F# undoubtedly have some buried mines that
we will, with benefit of ten years' hindsight, look back at in 2018 and say, "Wow,
how dumb were we to think that this was the last language we'd ever have to use!".
&lt;/p&gt;
&lt;p&gt;
That's experience talking. &lt;/p&gt;
&lt;p&gt;
And the funny thing is, it seems to have served us pretty well. When we don't listen
to the guys claiming to know how to use something effectively that they've never actually
used before, of course.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Caveat emptor.&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7ea05023-cdc1-439d-910d-bcff5f4ff309"/&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a rel="nofollow" target="_blank" href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=thpSqb"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=thpSqb" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/344379936" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/344379936/From+The+QuotYou+Must+Be+Trolling+For+Hitsquot+Department.aspx</link>
      <pubDate>Wed, 23 Jul 2008 20:53:00 GMT</pubDate>
    <feedburner:origLink>http://blogs.tedneward.com/2008/07/24/From+The+QuotYou+Must+Be+Trolling+For+Hitsquot+Department.aspx</feedburner:origLink></item>
    <item>
      <title>F# subreddit</title>
      <description>I created an F# subreddit for F# news/links.
I find Reddit&amp;#8217;s programming subreddit to be lacking recently, mostly because it seems ALL submissions get downvoted to 0 initially by bots and then only a few articles make it out of the hole. I&amp;#8217;m not sure if this is just the current state of the programming [...]
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=kjFx67"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=kjFx67" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/343400951" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/343400951/</link>
      <pubDate>Tue, 22 Jul 2008 21:18:03 GMT</pubDate>
    <feedburner:origLink>http://mbishop.esoteriq.org/weblog/?p=11</feedburner:origLink></item>
    <item>
      <title>Balanced parenthesis</title>
      <description>Checking whether a series of parenthesis is balanced and valid is a classic puzzle in computer science and can be easily met during a job interview.
In my opinion, there is no better solution than using a regular expression and solve the problem with a single (but almost unreadable) line of code, however I&amp;#8217;d like to [...]
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=OiJ3uH"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=OiJ3uH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/343005528" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/343005528/</link>
      <pubDate>Tue, 22 Jul 2008 11:48:05 GMT</pubDate>
    <feedburner:origLink>http://feeds.feedburner.com/~r/fsharpit/~3/342980285/</feedburner:origLink></item>
    <item>
      <title>Using LINQ with ArcObjects</title>
      <description>Are you using .NET 3.5 to do &lt;a rel="nofollow" target="_blank" href="http:///"&gt;ArcObjects&lt;/a&gt; programming? Are you still manually enumerating through row or feature cursors? Listen up!&lt;br /&gt;&lt;br /&gt;It's really very simple to get LINQ running with ArcObjects. All you have to do is add an extension method to either ICursor or IFeatureCursor like so:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span class="kwrd"&gt;public static class&lt;/span&gt; ICursorExtensions {&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;public static&lt;/span&gt; IEnumerable&amp;#60;IRow&amp;#62; AsEnumerable(this ICursor source) {&lt;br /&gt; &lt;span class="kwrd"&gt;Func&amp;#60;IRow&amp;#62;&lt;/span&gt; next = () =&amp;gt; source.NextRow();&lt;br /&gt; &lt;span class="kwrd"&gt;IRow&lt;/span&gt; current = next();&lt;br /&gt; &lt;span class="kwrd"&gt;while&lt;/span&gt; (current != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt; yield return current;&lt;br /&gt; current = next();&lt;br /&gt; } &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With your new extension method in hand, you can unleash LINQ on your ArcObjects code. You can now write code like this:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span class="kwrd"&gt;Int32&lt;/span&gt; count = cursor.AsEnumerable().Count();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or, you could write a query expression against two cursor objects:&lt;br /&gt;&lt;pre class="code"&gt;var resultSeq =&lt;br /&gt; from x in cursor1.AsEnumerable()&lt;br /&gt; from y in cursor2.AsEnumerable()&lt;br /&gt; where x.get_Value(0) = y.get_Value(0)&lt;br /&gt; select new { Left = x, Right = y };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can do a similar thing in F#:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span class="kwrd"&gt;type&lt;/span&gt; ICursor &lt;span class="kwrd"&gt;with&lt;/span&gt;&lt;br /&gt; member c.AsEnumerable() =&lt;br /&gt; &lt;span class="kwrd"&gt;seq&lt;/span&gt; { &lt;br /&gt; &lt;span class="kwrd"&gt;let&lt;/span&gt; next = c.NextRow&lt;br /&gt; &lt;span class="kwrd"&gt;let&lt;/span&gt; current = ref (next())&lt;br /&gt; &lt;span class="kwrd"&gt;while&lt;/span&gt; !current &amp;lt;&amp;gt; null do&lt;br /&gt; &lt;span class="kwrd"&gt;yield&lt;/span&gt; !current&lt;br /&gt; &lt;span class="kwrd"&gt;do&lt;/span&gt; current := next()&lt;br /&gt; }&lt;br /&gt;let count = cursor.AsEnumerable() |&amp;gt; Seq.length&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sure beats manually manipulating an enumerator, doesn't it?
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=KIvR8X"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=KIvR8X" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/342653697" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/342653697/using-linq-with-arcobjects.html</link>
      <author>Ray Vernagus</author>
      <pubDate>Mon, 21 Jul 2008 22:52:00 GMT</pubDate>
    <feedburner:origLink>http://vernagus.blogspot.com/2008/07/using-linq-with-arcobjects.html</feedburner:origLink></item>
    <item>
      <title>Five Minutes Past Noon Coffee 170</title>
      <description>&lt;ul&gt;
&lt;li&gt;
Ben Hall &lt;a rel="nofollow" target="_blank" href="http://blog.benhall.me.uk/2008/07/announcing-ironeditor-editor-for.html"&gt;announces&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://www.codeplex.com/IronEditor"&gt;IronEditor&lt;/a&gt;,
a simple dev tool for IronPython and IronRuby. Pretty nice, though fairly simplistic
(as Ben readily admits). For example, it doesn't have an interactive mode, only the
ability to execute scripts and direct the output to IronEditor's output window. However,
it is a good start and I'm sure it'll just get better. One thing he's &lt;a rel="nofollow" target="_blank" href="http://twitter.com/Ben_Hall/statuses/862967588"&gt;apparently
considering&lt;/a&gt; is a Silverlight version. (via &lt;a rel="nofollow" target="_blank" href="http://twitter.com/voidspace/statuses/862951177"&gt;Michael
Foord&lt;/a&gt;) &lt;li&gt;
Speaking of "Iron" tools, &lt;a rel="nofollow" target="_blank" href="http://www.sapphiresteel.com/"&gt;Sapphire Steel&lt;/a&gt; have
had an &lt;a rel="nofollow" target="_blank" href="http://www.sapphiresteel.com/Ruby-In-Steel-For-IronRuby"&gt;IronRuby
version (in alpha)&lt;/a&gt; of their &lt;a rel="nofollow" target="_blank" href="http://www.sapphiresteel.com/Ruby-In-Steel-Developer-Overview"&gt;Ruby
in Steel&lt;/a&gt; product for several months now. I wonder if &lt;a rel="nofollow" target="_blank" href="http://www.iunknown.com/"&gt;John's&lt;/a&gt; had
a chance to play with it. &lt;li&gt;
Speaking of John, the ASP.NET MVC / IronRuby prototype he &lt;a rel="nofollow" target="_blank" href="http://www.iunknown.com/2008/06/ironruby-and-aspnet-mvc.html"&gt;talked
about @ TechEd&lt;/a&gt; is &lt;a rel="nofollow" target="_blank" href="http://haacked.com/archive/2008/07/20/ironruby-aspnetmvc-prototype.aspx"&gt;now
available&lt;/a&gt; on ASP.NET MVC Preview 4 via Phil Haack. &lt;li&gt;
Ted Neward has &lt;a rel="nofollow" target="_blank" href="http://code.msdn.microsoft.com/IPyDD"&gt;an article&lt;/a&gt; exploring
the IronPython VS Integration sample that ships in the VS SDK. As I &lt;a rel="nofollow" target="_blank" href="http://devhawk.net/2008/07/17/IronPython+Post+20+Roadmap.aspx"&gt;mentioned
the other day&lt;/a&gt;, we're starting working on a production quality implementation of
VS Integration for IPy. &lt;li&gt;
Ophir Kra-Oz (aka Evil Fish) blogs &lt;a rel="nofollow" target="_blank" href="http://ophir.wordpress.com/2008/07/20/python-for-executives/"&gt;Python
for Executives&lt;/a&gt;. I like his "Risk, Recruiting, Performance and Maturity" model
- four boxes, perfect for keeping an executive's attention! :) Plus Ophir has some
nice things to say about IronPython. (via &lt;a rel="nofollow" target="_blank" href="http://twitter.com/voidspace/statuses/863648598"&gt;Michael
Foord&lt;/a&gt;) &lt;li&gt;
Ronnie Maor &lt;a rel="nofollow" target="_blank" href="http://www.ronnie-midnight-oil.net/2008/07/easier-python-evaluation-from-c.html"&gt;blogs&lt;/a&gt; an &lt;a rel="nofollow" target="_blank" href="http://www.ironpython.info/index.php/PythonEngineEvalExtension"&gt;extension
method for PythonEngine&lt;/a&gt; to make Eval simpler. I especially like how he uses string
format syntax so you can dynamically generate the code to eval. I wonder what this
would look like in IPy 2.0 with DLR Hosting API. (via &lt;a rel="nofollow" target="_blank" href="http://ironpython-urls.blogspot.com/2008/07/easier-python-evaluation-from-c.html"&gt;IronPython
URLs&lt;/a&gt;) &lt;li&gt;
Speaking of DLR Hosting, Seshadri has &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/seshadripv/archive/2008/07/17/dlr-hosting-sample-write-event-handlers-for-vs-in-ironpython.aspx"&gt;another
great DLR hosting post&lt;/a&gt;, this time hosting IPy inside of VS08 so you can script
VS08 events (document saved, window created, etc) with Python. &lt;li&gt;
Justin Etheredge has a bunch of IronRuby posts - &lt;a rel="nofollow" target="_blank" href="http://www.codethinked.com/post/2008/07/14/Getting-IronRuby-Up-and-Running.aspx"&gt;Getting
IronRuby Up and Running&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.codethinked.com/post/2008/07/17/Running-Applications-in-IronRuby.aspx"&gt;Running
Applications in IronRuby&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.codethinked.com/post/2008/07/21/Learning-Ruby-via-IronRuby-and-C-Part-1.aspx"&gt;Learning
Ruby via IronRuby and C# Part 1&lt;/a&gt;. (via &lt;a rel="nofollow" target="_blank" href="http://samgentile.com/blogs/samgentile/archive/2008/07/21/new-and-notable-255.aspx"&gt;Sam
Gentile&lt;/a&gt;) &lt;li&gt;
Don Syme &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/dsyme/archive/2008/07/19/f-and-arcgis-arcobjects.aspx"&gt;links&lt;/a&gt; to
several F# related posts by &lt;a rel="nofollow" target="_blank" href="http://vernagus.blogspot.com/"&gt;Ray Vernagus&lt;/a&gt;,
though he's apparently also &lt;a rel="nofollow" target="_blank" href="http://vernagus.blogspot.com/2007/10/extension-methods-and-ironruby.html"&gt;experimenting
with IronRuby&lt;/a&gt;. I'm really interested in his &lt;a rel="nofollow" target="_blank" href="http://www.cambridge.org/us/catalogue/catalogue.asp?isbn=0521663504"&gt;Purely
Functional Data Structures&lt;/a&gt; port to F#. &lt;li&gt;
Speaking of F#, Brian has a &lt;a rel="nofollow" target="_blank" href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!282.entry"&gt;teaser
screenshot&lt;/a&gt; of F# upcoming CTP. However, he chooses the New Item dialog to tease,
which looks pretty much like the current new item dialog (the new one does have fewer
F# templates). However, if you look in the Solution Explorer, you'll notice a real
"References" node. No more #I/#R! Yeah! &lt;li&gt;
The interactive graphic in &lt;a rel="nofollow" target="_blank" href="http://www.wired.com/special_multimedia/2008/st_infoporn_1607"&gt;Kevin
Kelly's One Machine article&lt;/a&gt; is fascinating. It really highlights that the vast
vast vast majority of power, storage, CPU cycles and RAM come from personal computers
on the edge. Even in bandwidth, where PC's still have the highest share but it looks
to be around 1/3rd, the aggregate of all edge devices (PCs, mobile phones, PDAs, etc.)
still dominates the data centers. &lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://devhawk.net/aggbug.ashx?id=a18942b5-00eb-411c-854e-70175a80daa5"/&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=IKZHTx"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=IKZHTx" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/341822865" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/341822865/Five+Minutes+Past+Noon+Coffee+170.aspx</link>
      <pubDate>Mon, 21 Jul 2008 08:05:04 GMT</pubDate>
    <feedburner:origLink>http://devhawk.net/2008/07/21/Five+Minutes+Past+Noon+Coffee+170.aspx</feedburner:origLink></item>
    <item>
      <title>Sneak peeks into the F# project system, part one</title>
      <description>Brian has some &lt;a rel="nofollow" class="" target="_blank" href="http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!282.entry"&gt;snapshots&lt;/a&gt;&amp;nbsp;:-)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8760995" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=Lpn2GK"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=Lpn2GK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/341559172" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/341559172/sneak-peeks-into-the-f-project-system-part-one.aspx</link>
      <pubDate>Sun, 20 Jul 2008 22:37:00 GMT</pubDate>
    <feedburner:origLink>http://blogs.msdn.com/dsyme/archive/2008/07/21/sneak-peeks-into-the-f-project-system-part-one.aspx</feedburner:origLink></item>
    <item>
      <title>Sneak peeks into the new F# project system, part one</title>
      <description>&lt;p&gt;We're getting closer to the next major release of F#: our first &lt;a rel="nofollow" target="_blank" href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!160.entry"&gt;CTP release&lt;/a&gt; out of Developer Division. As a result, now is a good time for me to start talking about some of what I've been working on for the past few months: the F# project system. Over the coming weeks I'll describe some of the new-to-F# project system features we'll deliver in the CTP, providing a "sneak peek" at what's coming. &lt;p&gt;For today, I'll just give an overview of some of the high points, and in subsequent blog entries, I'll dive down into the details of these features. The most noteworthy project system features I can think of are (in no particular order): &lt;ul&gt; &lt;li&gt;New F# project &amp;amp; item templates (for 'New Project' and 'Add New Item') &lt;li&gt;An 'Add Reference' dialog similar to C#'s, including project-to-project references &lt;li&gt;Support for linked items ('Add Existing Item'... 'Add as Link') &lt;li&gt;Support for folders and for reordering files within the project &lt;li&gt;Project property pages similar to C#'s &lt;li&gt;F# projects realized as '.fsproj' files that work with MSBuild &lt;li&gt;Some new features regarding scripts (.fsx files)&lt;/ul&gt; &lt;p&gt;Here's a teaser screenshot... &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://ec8eza.bay.livefilestore.com/y1p7IY7M3TBHjzdViQyTOcRFxCmuxrz6bK6mAjNXwwXpzSWu-h16BrbgMy1hSN6mXnSmr3ZDjeG_-U?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="235" alt="image" src="http://ec8eza.bay.livefilestore.com/y1pJhadO0gwlLYq2sj12HOhRsl6aHFmBRHFy8XUrhXqzCqpOubA2HZnfuKqgI8OZa5fT8xZvIgdmE6VM_zdyAqZ-Q?PARTNER=WRITER" width="644" border="0"&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8076776766069723920&amp;page=RSS%3a+Sneak+peeks+into+the+new+F%23+project+system%2c+part+one&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lorgonblog.spaces.live.com&amp;amp;GT1=lorgonblog"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=8opj0b"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=8opj0b" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/341170985" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/341170985/cns!701679AD17B6D310!282.entry</link>
      <pubDate>Sun, 20 Jul 2008 16:02:01 GMT</pubDate>
    <feedburner:origLink>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!282.entry</feedburner:origLink></item>
    <item>
      <title>F#: Must fully qualify class members, even inside the class</title>
      <description>&lt;p&gt;It is not the end of the world, but somewhat annoying: class members must always be referred by their fully qualified name, even inside class methods:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Foo = class static member Method(x) = ... static member Field = ... member self.FooBar() = Method(42) &lt;font color="green"&gt;// won&amp;#8217;t work: &amp;#8220;constructor Method is not defined&amp;#8221;&lt;/font&gt; Foo.Method( Field ) &lt;font color="green"&gt;// won&amp;#8217;t work either&lt;/font&gt; end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=PRQ1fj"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=PRQ1fj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340982760" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340982760/</link>
      <author>Ivan</author>
      <pubDate>Sun, 20 Jul 2008 11:06:02 GMT</pubDate>
    <feedburner:origLink>http://ikriv.com:8765/blog/?p=36</feedburner:origLink></item>
    <item>
      <title>Boolean operations in F#: spec gone bad</title>
      <description>&lt;p&gt;The &lt;a rel="nofollow" target="_blank" href="http://research.microsoft.com/fsharp/manual/spec2.aspx"&gt;F# language specification&lt;/a&gt; does not talk much about Boolean operations, but it does say that &lt;code&gt;~~~&lt;/code&gt; is &lt;code&gt;op_LogicalNot&lt;/code&gt; and &lt;code&gt;&amp;amp;&amp;amp;&amp;amp;&lt;/code&gt; is a &amp;#8220;bitwise and&amp;#8221;, also called &lt;code&gt;land&lt;/code&gt;. The &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator is said to be an &amp;#8220;address-of&amp;#8221; expression.&lt;/p&gt;
&lt;p&gt;In reality &lt;code&gt;if ~~~&lt;i&gt;condition&lt;/i&gt;&lt;/code&gt; does not work: it complains that &lt;code&gt;bool&lt;/code&gt; does not define operator &lt;code&gt;~~~&lt;/code&gt;. What works is &lt;code&gt;if not condition&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;if a &amp;amp;&amp;amp;&amp;amp; b&lt;/code&gt; does not work either. What works is &lt;code&gt;if a &amp;amp;&amp;amp; b&lt;/code&gt;. So much for the address-of operator. I am not sure why it is not possible to keep the spec straight and why I should second-guess such simple things&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=0rE5qR"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=0rE5qR" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340956852" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340956852/</link>
      <author>Ivan</author>
      <pubDate>Sun, 20 Jul 2008 08:19:02 GMT</pubDate>
    <feedburner:origLink>http://ikriv.com:8765/blog/?p=35</feedburner:origLink></item>
    <item>
      <title>Awesome new Groovy Mixin Syntax (and F#'s alternative)</title>
      <description>&lt;a rel="nofollow" target="_blank" href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;'s &lt;a rel="nofollow" target="_blank" href="http://groovy.codehaus.org/api/groovy/lang/MetaClass.html"&gt;MetaClass &lt;/a&gt;recently acquired some new features...&lt;br /&gt;&lt;br /&gt;Check out how easy it is to add multiple new methods to an existing class:&lt;br /&gt;&lt;pre style="border:1px dashed rgb(153, 153, 153);padding:5px;overflow:auto;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;color:rgb(0, 0, 0);background-color:rgb(238, 238, 238);font-size:12px;line-height:14px;width:100%;"&gt;&lt;code&gt;class ListUtils {&lt;br /&gt; static foo(List list) { "foo called" }&lt;br /&gt; static bar(List list) { "bar called" }&lt;br /&gt;}&lt;br /&gt;List.metaClass.mixin ListUtils&lt;br /&gt;&lt;br /&gt;assert "foo called" == [1, 2, 3].foo()&lt;br /&gt;assert "bar called" == [1, 2, 3].bar()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;From the DefaultGroovyMethods source, it looks like you can currently call .mixin on any Class or MetaClass object, passing a new Class (here ListUtils) or list of classes. Awesome.&lt;br /&gt;&lt;br /&gt;Paulk made a few comments regarding the Maximum Segment Sum implementation in Groovy from my &lt;a rel="nofollow" target="_blank" href="http://hamletdarcy.blogspot.com/2008/07/groovy-vs-f-showdown-side-by-side.html"&gt;last post&lt;/a&gt;. Looking at both the F# and &lt;a rel="nofollow" target="_blank" href="http://www.hamletdarcy.com/files/2008/FsharpVsGroovy.html"&gt;Groovy original implementations&lt;/a&gt;, it was easy to see the value that F# brought for functional programming. But the new versions can be &lt;a rel="nofollow" target="_blank" href="http://www.hamletdarcy.com/files/2008/FsharpVsGroovy2.html"&gt;seen here&lt;/a&gt;, and the results are not so different.&lt;br /&gt;&lt;br /&gt;Open classes are still available in F#, despite it being a statically typed, compiled language. I still find the F# open classes syntax simple and appealing:&lt;br /&gt;&lt;pre style="border:1px dashed rgb(153, 153, 153);padding:5px;overflow:auto;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;color:rgb(0, 0, 0);background-color:rgb(238, 238, 238);font-size:12px;line-height:14px;width:100%;"&gt;&lt;code&gt;open List&lt;br /&gt;&lt;br /&gt;type List with&lt;br /&gt; member x.foo = "foo called"&lt;br /&gt; member x.bar = "bar called"&lt;br /&gt;&lt;br /&gt;if "foo called" &amp;lt;&amp;gt; [1;2;3].foo then failwith "error"&lt;br /&gt;if "bar called" &amp;lt;&amp;gt; [1;2;3].bar then failwith "error"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;I especially like how the 'this' reference can be named anything at all (here 'x').&lt;br /&gt;&lt;br /&gt;Let the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Perl_golf#Perl_golf"&gt;golf &lt;/a&gt;begin.
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=5G1JWm"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=5G1JWm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340503241" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340503241/awesome-new-groovy-mixin-syntax-and-fs.html</link>
      <author>Hamlet D'Arcy</author>
      <pubDate>Sat, 19 Jul 2008 10:48:00 GMT</pubDate>
    <feedburner:origLink>http://hamletdarcy.blogspot.com/2008/07/awesome-new-groovy-mixin-syntax-and-fs.html</feedburner:origLink></item>
    <item>
      <title>F# and ArcGIS/ArcObjects</title>
      <description>&lt;p&gt;&lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/"&gt;Ray Vernagus&lt;/a&gt; has posted &lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/2007/09/interested-in-programming-with.html"&gt;an introduction to using F# with ArcGIS through ArcObjects&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One of the things I like most about F# is how it allows typed functional programming to be applied to data-rich domains such as Machine Learning, Computer Aided Design (CAD) and Geographical Information Systems (GIS). GIS is of particular interest to me as I learned a lot about this area back in my undergraduate days, and because of the ever-enduring appeal of maps and simulation. Like Kean Wamsley's &lt;a rel="nofollow" class="" target="_blank" href="http://through-the-interface.typepad.com/through_the_interface/2008/03/initialization.html"&gt;F#&lt;/a&gt; &lt;a rel="nofollow" class="" target="_blank" href="http://through-the-interface.typepad.com/through_the_interface/2008/01/turning-autocad.html"&gt;and&lt;/a&gt; &lt;a rel="nofollow" class="" target="_blank" href="http://through-the-interface.typepad.com/through_the_interface/2008/05/generating-frac.html"&gt;AutoCAD&lt;/a&gt; examples, it's just amazing how easy it is to get going with F# and &lt;a rel="nofollow" class="" target="_blank" href="http://www.esri.com/software/arcgis/arcinfo/about/features.html"&gt;ArcInfo&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Ray also has a few other useful posts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/2007/09/easy-testing-in-f.html"&gt;Easy Testing in F#&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/2007/09/functional-programming-patterns.html"&gt;Functional Programming Patterns&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/2007/10/purely-functional-data-structures-f.html"&gt;Purely Functional Data Structures: an F# Stack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/2007/10/purely-functional-data-structures-f_14.html"&gt;Purely Functional Data Structures: An F# Binary Tree&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;and a useful update to a code sample in Expert F#:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a rel="nofollow" class="" target="_blank" href="http://vernagus.blogspot.com/2008/07/kill-that-annoying-flicker.html"&gt;Kill That Annoying Flicker&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8755481" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=HPvMws"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=HPvMws" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340093189" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340093189/f-and-arcgis-arcobjects.aspx</link>
      <pubDate>Sat, 19 Jul 2008 05:28:00 GMT</pubDate>
    <feedburner:origLink>http://blogs.msdn.com/dsyme/archive/2008/07/19/f-and-arcgis-arcobjects.aspx</feedburner:origLink></item>
    <item>
      <title>Help with study of functional programmers</title>
      <description>&lt;p&gt;Are you currently developing or maintaining a medium to large-sized program written in a functional language, such as Haskell, F#, OCaml, or Lisp?&amp;nbsp;&amp;nbsp;Chris Bogart is&amp;nbsp;a PhD student doing a study of functional programmers, as part of a research internship at Microsoft, and would like the opportunity to look over your shoulder while you do debugging or coding on your project. Here's what he says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I'm looking for people with at least a year's experience doing functional programming, and who are currently working on a real project (i.e. for some purpose other than learning functional programming).&amp;nbsp; I'm only allowed to use people who can work in the US (because of the gratuity, which is taxable income). I'd simply come watch you work, and ask a few questions along the way. You'd do whatever you would normally be doing.&amp;nbsp; If you're near Seattle or Portland, I'd come to your office for a couple of hours.&amp;nbsp; If you're not near Seattle or Portland, then we'd set you up with LiveMeeting or some other remote screencast software so I can watch you from here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Obviously security concerns are an issue - I will not share any proprietary information that I learn about while visiting you.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In exchange for your help, Microsoft will offer you your pick of free software off its gratuity list (which has about 50 items, including Visual Studio Professional, Word for Mac, XBOX 360 games) or any book from MS Press.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We're doing this because expert functional programmers have not been studied much.&amp;nbsp; We plan to share our findings through academic publications, to help tool developers create debugging tools that are genuinely helpful in real-world settings.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I'm hoping to finish my observations by August 8th, so please contact me immediately if you're interested!&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Thank you,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chris Bogart&lt;br&gt;425-538-3562&lt;br&gt;&lt;/em&gt;&lt;a rel="nofollow" target="_blank" href="mailto:t-chribo@microsoft.com"&gt;&lt;em&gt;t-chribo@microsoft.com&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8750749" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=Ktkmpy"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=Ktkmpy" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/339376346" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/339376346/help-with-study-of-functional-programmers.aspx</link>
      <pubDate>Fri, 18 Jul 2008 07:38:00 GMT</pubDate>
    <feedburner:origLink>http://blogs.msdn.com/dsyme/archive/2008/07/18/help-with-study-of-functional-programmers.aspx</feedburner:origLink></item>
    <item>
      <title>C# Dictionary to F# Map</title>
      <description>Following on from my past blog on effective parallelism I&amp;#8217;ve continued digging into the functional language F#. I&amp;#8217;m getting there – slowly and I am loving immutability. It&amp;#8217;s quite a mindset change from my day-to-day work in imperative languages but I can see a little bit of progress in my functional thinking every day.
I&amp;#8217;m doing [...]
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=xJQDsP"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=xJQDsP" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/339825679" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/339825679/</link>
      <pubDate>Fri, 18 Jul 2008 07:20:04 GMT</pubDate>
    <feedburner:origLink>http://www.jenkz.org/2008/07/18/c-dictionary-to-f-map/</feedburner:origLink></item>
    <item>
      <title>Groovy vs. F# Showdown - Side by Side Comparison</title>
      <description>Ah, our old friend Maximum Segment Sum. Given a list of integers, find the highest sum of any set of adjacent integers. The list [ 1, 2, 3, -4] has an MSS of 6 (1 + 2 + 3). The solution is deceptively simple:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;mss = max º sum* º (flatten º tails* º inits)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Briefly explained…&lt;br /&gt;&lt;br /&gt;inits() returns all the initial segments of a list in order of increasing length. So the inits of [1, 2, 3] is [ [1], [1,2], [1,2,3] ]&lt;br /&gt;&lt;br /&gt;tails() returns all the trailing segments of a list in order of decreasing length. So the tails of [1, 2, 3] is [ [1,2,3], [2,3], [3] ]&lt;br /&gt;&lt;br /&gt;Calculating the MSS is as simple as taking the inits of a list, taking the tails of the result, find the sum of each element in that result, and return the maximum entry. Simple, right?&lt;br /&gt;&lt;br /&gt;Solving this is a great way to practice functional programming, which I did using Groovy in &lt;a rel="nofollow" target="_blank" href="http://hamletdarcy.blogspot.com/2008/05/functional-calisthenics.html"&gt;Function Calisthenics&lt;/a&gt; a few months ago, and again last night using F#.&lt;br /&gt;&lt;br /&gt;The F# and Groovy results can be seen side by side here: &lt;a rel="nofollow" target="_blank" href="http://www.hamletdarcy.com/files/2008/FsharpVsGroovy.html"&gt;http://www.hamletdarcy.com/files/2008/FsharpVsGroovy.html&lt;/a&gt; (I suggest opening it up in a new window big enough so that the lines don’t wrap).&lt;br /&gt;&lt;br /&gt;Which begs the question, “Why would you ever want to compare F# (or OCaml) to Groovy?”&lt;br /&gt;&lt;br /&gt;Because it explores the answers to a few other questions:&lt;br /&gt;&lt;br /&gt;Are dynamically typed languages more concise than statically typed ones? Maybe the comparison between Java and Groovy isn’t a fair comparison, because the results here show F#/OCaml being more concise.&lt;br /&gt;&lt;br /&gt;How awful is the F#/OCaml syntax? You can make your own conclusion, but it might be worth spending a few hours with the language before pronouncing a victor. I personally have found the freedom from curly braces and good recursion support a Good Thing.&lt;br /&gt;&lt;br /&gt;Do I want to give F#/OCaml a try? That’s kinda the point of writing a post about the language, isn’t it?&lt;br /&gt;&lt;br /&gt;So here goes…&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conciseness&lt;/span&gt; – The F# version is shorter, there’s no denying that. You also don’t need to add any type information despite the fact that the language is statically typed and the IDE shows you compiler errors as they happen. Also, the F# libraries offer much better support for functional constructs. For instance, the &lt;a rel="nofollow" target="_blank" href="http://research.microsoft.com/fsharp/manual/FSharp.Core/Microsoft.FSharp.Collections.List.html"&gt;map_concat function&lt;/a&gt; doesn’t exist in Groovy, so much of the Groovy code is simply reducing a List of Lists of Lists to a List of Lists. Groovy support for closures and collections is good, but check out the F# documentation and see all functions you wish you had. There is certainly a learning curve to understanding the map*, fold*, and reduce* functions, but I contend that it’s worth the time to learn the fundamentals of Computer Science, which these concepts can rightly be categorized as.&lt;br /&gt;&lt;br /&gt;Also, concise List and Map (and &lt;a rel="nofollow" target="_blank" href="http://research.microsoft.com/fsharp/manual/FSharp.Core/Microsoft.FSharp.Collections.Seq.html"&gt;Sequence&lt;/a&gt;!) creation using the [ a, b, c ] notation is a wonderful thing. But this is an issue with Java, not statically typed languages in general.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Awful Syntax&lt;/span&gt; – Come on, is it really that bad? Sure there is a new set of libraries to learn… but you’re not exactly investing in learning the .NET libraries, just the F# ones. I don’t know a thing about .NET and this was fairly simple. It doesn’t even really rely on the .NET libraries in this example (under the covers it does because it’s implemented in a .NET language and provides interoperability, but that’s another matter). Ricky Clarkson explores having to learn a new syntax in his post “&lt;a rel="nofollow" target="_blank" href="http://rickyclarkson.blogspot.com/2008/01/in-defence-of-0l-in-scala.html"&gt;In Defence of (0/:l)(_+_) in Scala&lt;/a&gt;”, which includes a quote from David MacIver: "Optimising your notation to not confuse people in the first 10 minutes of seeing it but to hinder readability ever after is a really bad mistake." Exactly. Maybe its time we ditch the C++/Java syntax. It’s not that hard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Giving F#/OCaml a shot&lt;/span&gt; – Let me be clear: Learning F# is not the same as learning .NET. There are plenty of directions online for running it under Mono in Mac/Linux, and the F# install comes with an install-mono.sh shell script. I got it to run on an EEE PC with Xandros Linux without much effort. And there have been plenty of “wow” moments learning F# including wondering how the heck the compiler knows about my types and the satisfaction of finally understanding what “('a -&amp;gt; 'b) -&amp;gt; 'a list -&amp;gt; 'b list” means (Hint: it is a type signature that takes a function and a list and returns another list).&lt;br /&gt;&lt;br /&gt;And why would you not want to make this comparison? Groovy is not a functional language and doesn’t advertise itself to be. Closure/lambda support in Groovy is good, and enables a functional style, but it’s not quite a level playing field. A comparison of the languages in an Object Oriented style might well yield different results.&lt;br /&gt;&lt;br /&gt;Anyway, give it a shot, my friends, give it a shot. Perhaps the sweet F# handout can shed some light: &lt;a rel="nofollow" target="_blank" href="http://hamletdarcy.blogspot.com/2008/07/f-handout-available.html"&gt;http://hamletdarcy.blogspot.com/2008/07/f-handout-available.html&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=KBFUe9"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=KBFUe9" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340503242" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340503242/groovy-vs-f-showdown-side-by-side.html</link>
      <author>Hamlet D'Arcy</author>
      <pubDate>Thu, 17 Jul 2008 06:58:00 GMT</pubDate>
    <feedburner:origLink>http://hamletdarcy.blogspot.com/2008/07/groovy-vs-f-showdown-side-by-side.html</feedburner:origLink></item>
    <item>
      <title>Blog change? Ads? What gives?</title>
      <description>&lt;p&gt;
If you've peeked at my blog site in the last twenty minutes or so, you've probably
noticed some churn in the template in the upper-left corner; by now, it's been finalized,
and it reads "JOB REFERRALS".
&lt;/p&gt;
&lt;p&gt;
WTHeck? Has Ted finally sold out? Sort of, not really. At least, &lt;em&gt;I&lt;/em&gt; don't
think so.
&lt;/p&gt;
&lt;p&gt;
Here's the deal: the company behind those ads, Entice Labs, contacted me to see if
I was interested in hosting some job ads on my blog, given that I seem to generate
a moderate amount of traffic. I figured it was worthwhile to at least talk to them,
and the more I did, the more I liked what I heard--the ads are focused specifically
at developers of particular types (I chose a criteria string of "Software Developers",
subcategorized by "Java, .NET, .NET (Visual Basic), .NET (C#), C++, Flex, Ruby on
Rails, C, SQL, JavaScript, HTML" though I'm not sure whether "HTML" will bring in
too many web-designer jobs), and visitors to my blog don't have to click through the
ads to get to the content, which was important to me. And, besides, given the current
economic climate, if I can help somebody find a new job, I'd like to.
&lt;/p&gt;
&lt;p&gt;
Now for the full disclaimer: I &lt;em&gt;will&lt;/em&gt; be getting money back from these job
ads, though how much, to be honest with you, I'm not sure. I'm really not doing this
for the money, so I make this statement now: I will take 50% of whatever I make through
this program and donate it to a charitable organization. The other 50% I will use
to offset travel and expenses to user groups and/or CodeCamps and/or for-free conferences
put on throughout the country. (Email me if you know of one that you're organizing
or attending and would like to see me speak at, and I'll tell you if there's any room
in the budget left for it. :-) )
&lt;/p&gt;
&lt;p&gt;
Anyway, I figured if the ads got too obnoxious, I could always remove them; it's an
experiment of sorts. Tell me what you think.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=ddbdc499-d4e2-4b12-a2f1-165ab3617887"/&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a rel="nofollow" target="_blank" href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=CEV9d7"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=CEV9d7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/337665012" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/337665012/Blog+Change+Ads+What+Gives.aspx</link>
      <pubDate>Wed, 16 Jul 2008 15:29:04 GMT</pubDate>
    <feedburner:origLink>http://blogs.tedneward.com/2008/07/17/Blog+Change+Ads+What+Gives.aspx</feedburner:origLink></item>
    <item>
      <title>Kill That Annoying Flicker</title>
      <description>The DataSamples sample (pp. 291-303) in Expert F# has an annoying flicker that can be fixed by adding the following line of code after line 101:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span class="kwrd"&gt;do&lt;/span&gt; base.SetStyle(ControlStyles.AllPaintingInWmPaint |||&lt;br /&gt; ControlStyles.UserPaint |||&lt;br /&gt; ControlStyles.DoubleBuffer,&lt;br /&gt; true)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you're writing the code yourself, put the above line after this line:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span class="kwrd"&gt;do&lt;/span&gt; base.BackColor &amp;lt;- Color.DarkBlue &lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=f6SstW"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=f6SstW" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/337626135" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/337626135/kill-that-annoying-flicker.html</link>
      <author>Ray Vernagus</author>
      <pubDate>Wed, 16 Jul 2008 10:29:00 GMT</pubDate>
    <feedburner:origLink>http://vernagus.blogspot.com/2008/07/kill-that-annoying-flicker.html</feedburner:origLink></item>
    <item>
      <title>Learning Erlang - Erlang Gaining Momentum</title>
      <description>You may have noticed that I've been talking a bit about &lt;a rel="nofollow" target="_blank" href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/06/18/concurrency-in-net-learning-from-erlang.aspx"&gt;concurrency and Erlang recently&lt;/a&gt;.&amp;nbsp; I've started to notice that others are taking notice and giving &lt;a rel="nofollow" target="_blank" href="http://www.erlang.org"&gt;Erlang&lt;/a&gt; another look.&amp;nbsp; I've been a fan of the language for a while, although it is a functional language ala a Haskell, OCaml, F# and so on, it's key strengths doesn't come necessarily from that, but from how it handles concurrency.&amp;nbsp; I'm really fond of the language succinctness and beauty using pattern matching, higher order functions and so on much as I have with F#.&lt;br&gt;
&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;Gaining Momentum&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
As I stated before, many people are starting to give Erlang another look.&amp;nbsp; For more than 20 years since its inception around 1987, Erlang has received little notice outside of the telecomm industry from whence it came.&amp;nbsp; Then in 1998, it was released as open source, but still not much momentum gathered around the language.&amp;nbsp; But, then things started to change recently.&amp;nbsp; Moore's law started to change, not from faster CPUs, but more cores to the CPUs.&amp;nbsp; Our traditional methods of sequential imperative programming couldn't scale and utilize a lot of the machine this way.&amp;nbsp; &lt;br&gt;
&lt;br&gt;
Then we started thinking about locks, monitors, mutexes, but the programming model isn't exactly easy.&amp;nbsp; And to boot, they tend to be a bit low-level for most pieces that we need.&amp;nbsp; Instead, we need more constructs such as guaranteeing pure functions and this function is ok for concurrency at either a language level or at least a library level.&amp;nbsp; Erlang is designed with this in mind, as it is a functional language, so functions are values, and values are immutable.&amp;nbsp; But not only that, the isolation of the processes allows for lightweight processes with no shared state between them.&amp;nbsp; This allows for a given process to fail without taking down the whole system, another important concurrency item that is important.&lt;br&gt;
&lt;br&gt;
With this, companies started to take notice.&amp;nbsp; As noted by a post by &lt;a rel="nofollow" target="_blank" href="http://vertonghen.wordpress.com/"&gt;Chris Vertonghen&lt;/a&gt; in his post &lt;a rel="nofollow" target="_blank" href="http://vertonghen.wordpress.com/2008/07/05/erlang-or-utility-computing-vs-appliance-computing/"&gt;"Erlang, or Utility-computing vs. Appliance-computing"&lt;/a&gt;, he notes a few items of interest such as:&lt;br&gt;
&lt;ul&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.satine.org/archives/2007/12/13/amazon-simpledb/"&gt;Amazon SimpleDB is built on Erlang&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.computerjobs.com/job_display.aspx?jobid=2052172"&gt;IMDB switching from PERL to Erlang&lt;/a&gt; &lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://highscalability.com/new-facebook-chat-feature-scales-70-million-users-using-erlang"&gt;Facebook chat written in Erlang&lt;/a&gt; &lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://yarivsblog.com/articles/2007/07/23/erlang-style-concurrency-in-google-gears/"&gt;Google Gears using "Erlang-style" concurrency&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
Other places are also looking at Erlang.&amp;nbsp; According to the &lt;a rel="nofollow" target="_blank" href="http://github.com/blog/112-supercharged-git-daemon"&gt;GitHub blog&lt;/a&gt;, there is a&amp;nbsp; project called egitd and is a replacement for the stock git-daemon that ships with git.&amp;nbsp; Erlang is perfect for these massively concurrent systems with good failover capabilities.&amp;nbsp; &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;Getting Started&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Getting started in Erlang is pretty easy.&amp;nbsp; Joe Armstrong's Programming in Erlang book tells you all you need to know on how to set it up.&amp;nbsp; I downloaded the &lt;a rel="nofollow" target="_blank" href="http://erlang.org/download.html"&gt;distribution from the Erlang site&lt;/a&gt; for the runtime and I used &lt;a rel="nofollow" target="_blank" href="http://www.elcipse.org"&gt;Eclipse&lt;/a&gt; with &lt;a rel="nofollow" target="_blank" href="http://erlide.sourceforge.net/"&gt;Erlide&lt;/a&gt; to run through the samples in the book.&amp;nbsp; I had no issues setting it up and it's quite easy to use.&amp;nbsp; &lt;br&gt;
&lt;br&gt;
I highly recommend that you get Joe Armstrong's &lt;a rel="nofollow" target="_blank" href="http://www.pragprog.com/titles/jaerlang/programming-erlang"&gt;Programming Erlang&lt;/a&gt; book as well as check out the Pragmatic Programmer screencasts on Erlang which you can find &lt;a rel="nofollow" target="_blank" href="http://www.pragprog.com/screencasts/v-kserl/erlang-by-example"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;From the F# Perspective&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
I've stated before that Erlang-style messaging through mailboxes is already supported in F#.&amp;nbsp; But, it's nowhere near as capable as Erlang.&amp;nbsp; Let's hope these kinds of issues can be raised and added to the libraries.&amp;nbsp; But, let's look at it from another perspective.&amp;nbsp; If you know functional programming and F#, you shouldn't have trouble in Erlang whatsoever.&amp;nbsp; In fact, I have a few examples of functions written in both Erlang and F# that do the same thing.&amp;nbsp; &lt;br&gt;
&lt;br style="text-decoration:underline;"&gt;
&lt;span style="text-decoration:underline;"&gt;Pattern Matching&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Pattern matching is pretty important in Erlang.&amp;nbsp; Such constructs as for loops do not exist, instead relying on patterns instead to handle the basic control flow.&amp;nbsp; Let's look at a simple area calculator written in Erlang.&lt;br&gt;
&lt;br&gt;
-module(geometry)&lt;br&gt;
-export(area/1)&lt;br&gt;
area({rectangle, Width, Ht}) -&amp;gt; Width * Ht;&lt;br&gt;
area({circle, R}) -&amp;gt; 3.14159 * R * R;&lt;br&gt;
area({square, X}) -&amp;gt; X * X.&lt;br&gt;
&lt;br&gt;
geometry:area({rectangle, 10, 5}).&lt;br&gt;
geometry:area({circle, 1.4}).&lt;br&gt;
geometry:area({square, 2.5}).&lt;br&gt;
&lt;br&gt;
What this sample did was used a tuple to wrap up the type of rectangle, circle and square.&amp;nbsp; Then I create multiple area functions that are my pattern.&amp;nbsp; Then at the bottom, after compiling and exporting my functions through my module, I'm able to call the functions with the given values.&amp;nbsp; How about in F#?&lt;br&gt;
&lt;br&gt;
module Geometry =&lt;br&gt;
&amp;nbsp; type Shape = Circle of float | Rectangle of float * float | Square of float&lt;br&gt;
&lt;br&gt;
&amp;nbsp; let area = function&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | Circle R -&amp;gt; 3.13159 * R * R&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | Rectangle (Width, Ht) -&amp;gt; Width * Ht&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | Square X -&amp;gt; X * X&lt;br&gt;
&amp;nbsp; &lt;br&gt;
Geometry.area (Geometry.Rectangle(10.0, 5.0))&lt;br&gt;
Geometry.area (Geometry.Circle(1.4))&lt;br&gt;
Geometry.area (Geometry.Square(2.5))&lt;br&gt;
&lt;br&gt;
I changed the shape to be a discriminated union because overloading of functions to take different tuples is not allowed.&amp;nbsp; Instead, I then switched to a union and pattern matched against that, thus giving the value.&amp;nbsp; Let's move onto more quick examples on how they differ&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline;"&gt;Lists&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Simple list processing is also pretty important.&amp;nbsp; F# and Erlang are also quite similar in this respect as well.&amp;nbsp; There are a few things F# doesn't have such as the remove operator, but for the most part, it's pretty comparable.&amp;nbsp; Functional languages have much different collections than imperative ones, which are optimized for recursion.&amp;nbsp; This includes the feature of the head, the first item in the list, and the tail, the rest of the list.&amp;nbsp; Let's look at a simple sum function in Erlang.&lt;br&gt;
&lt;br&gt;
-module(MyLists)&lt;br&gt;
-export(sum/1)&lt;br&gt;
sum([H|T]) -&amp;gt; H + sum(T).&lt;br&gt;
sum([])&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; 0.&lt;br&gt;
&lt;br&gt;
L = [1,3,10]&lt;br&gt;
MyLists:sum(L)&lt;br&gt;
&lt;br&gt;
What I am able to do is pattern match against the head and the tail of the given list to add the head value to the recursive call to the tail through linear recursion.&amp;nbsp; Next, I'll take that same sample and port it to F# to show how little difference there is.&lt;br&gt;
&lt;br&gt;
module MyLists = &lt;br&gt;
&amp;nbsp; let rec sum = function&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | [] -&amp;gt; 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | H::T -&amp;gt; H + sum(T) &lt;br&gt;
&lt;br&gt;
let l = [1;3;10;]&lt;br&gt;
let lResult = MyLists.sum(l)&lt;br&gt;
&lt;br&gt;
Applying lambda expressions on top of lists is pretty simple as well.&amp;nbsp; Here is a simple map function on a list in both Erlang and F#.&lt;br&gt;
&lt;br&gt;
-import(lists, [map/2]).&lt;br&gt;
L = [2,4,6,8,10].&lt;br&gt;
LResult = lists.map(fun(x) -&amp;gt; x*x end, L).&lt;br&gt;
&lt;br&gt;
And then in F#, to be able to do the map:&lt;br&gt;
&lt;br&gt;
[2;4;6;8;10] |&amp;gt; List.map(fun x -&amp;gt; x * x)&lt;br&gt;
&lt;br&gt;
As you can see, there are some differences, but for the most part, I haven't had any issues jumping between the languages.&amp;nbsp; This was just meant to be a little exercise about how you can learn from each language.&amp;nbsp; There is much to be learned from both languages, especially in regards to concurrency.&amp;nbsp; I hope to cover more of that shortly.&amp;nbsp; &lt;br&gt;
&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;Wrapping It Up&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Functional languages such as Erlang and F# have a lot to offer in terms of concurrency oriented programming.&amp;nbsp; I think now that Moore's law has changed in a way that standard sequential programming doesn't work as well, it's time to start discovering what the functional programming people and for that matter Erlang people have been talking about.&amp;nbsp; This is meant to give you just a little kickstart to look at Erlang, and indeed F# for concurrency.&amp;nbsp; But, not only that, but take the ideas from here and apply them to your other language of choice whether it be C#, Ruby, Python and so on.&lt;br&gt;
&lt;br&gt;
The real keys to success for Erlang reside not only in the language itself, but also the frameworks around it, and the tooling, such as the IDEs, etc.&amp;nbsp; Ruby became popular as a language due to the Rails framework although the tooling still isn't the best for it.&amp;nbsp; How will Erlang grow in this area remains to be seen, but I am optimistic.
&lt;br&gt;
&lt;br&gt;
&lt;a rel="nofollow" target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://weblogs.asp.net/podwysocki/archive/2008/07/16/learning-erlang-erlang-gaining-momentum.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://weblogs.asp.net/podwysocki/archive/2008/07/16/learning-erlang-erlang-gaining-momentum.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=Vhk5uK"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=Vhk5uK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/336833499" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/336833499/learning-erlang-erlang-gaining-momentum.aspx</link>
      <pubDate>Tue, 15 Jul 2008 17:00:00 GMT</pubDate>
    <feedburner:origLink>http://weblogs.asp.net/podwysocki/archive/2008/07/16/learning-erlang-erlang-gaining-momentum.aspx</feedburner:origLink></item>
    <item>
      <title>Recursing into List Processing</title>
      <description>Lately I've been getting back to basics with regards to recursion.&amp;nbsp; This is a basic and essential skill, especially in the functional programming world.&amp;nbsp; Today's dive will be into immutable lists and recursion.&amp;nbsp; I'll do my best to provide the F# and C# equivalent to each call.&amp;nbsp; This is in part of the back to basics and from here I'll move onto other subjects.&lt;br&gt;
&lt;br&gt;
Let's catch up to where we are today:&lt;br&gt;
&lt;ul&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/07/02/define-recursion-see-recursion.aspx"&gt;Part 1 - Basic Recursion Techniques&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/07/07/recursing-into-linear-tail-and-binary-recursion.aspx"&gt;Part 2 - Linear, Tail, and Binary Recursion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br style="font-weight:bold;"&gt;
&lt;span style="font-weight:bold;"&gt; Recursive List Processing&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
In the functional programming world, and especially in the functional programming world are singly linked immutable lists.&amp;nbsp; Each of the items in the list is a cell with a reference to the next item in the list.&amp;nbsp; For functional programming, unlike imperative programming, they are optimized for recursion.&amp;nbsp; By that I mean that they have a head (the first item) and the tail (the rest of the list).&amp;nbsp; F# has the use of this through the List&amp;lt;'a&amp;gt; class.&lt;br&gt;
&lt;br&gt;
Let's walk through a simple example of how you might sum up all items in a list using recursion as well as one for calcuating the length of the list.&amp;nbsp; In F# this is pretty simple, using pattern matching.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline;"&gt;F#&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;pre class="c-sharp"&gt;#light module ListExtensions = let rec sum = function | [] -&amp;gt; 0 | h::t -&amp;gt; h + sum t let rec length = function | [] -&amp;gt; 0 | h::t -&amp;gt; 1 + length t [1..20] |&amp;gt; ListExtensions.sum |&amp;gt; print_any
[1..10] |&amp;gt; ListExtensions.length |&amp;gt; print_any
&lt;/pre&gt;
&lt;br&gt;
This function above had a simple pattern matching over the list which said for an empty list, the result would be zero, else it would be the sum of the head and the calculation of the rest of the list and eventually winds its way down to the end of the list.&amp;nbsp; Likewise inthe length, it adds 1 to the calculation of the length function until it winds down to nothing left in the list.&amp;nbsp; In the base .NET libraries, we don't have a list like this, but it's actually not that hard to create one.&amp;nbsp; Let's walk through a simple immutable linked list much like the List&amp;lt;'a&amp;gt; in F#.&lt;br&gt;
&lt;br&gt;
Let's define in C# what something like that might look like.&amp;nbsp; I'll start with something the way &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/wesdyer/archive/2007/02/12/why-all-of-the-love-for-lists.aspx"&gt;Wes Dyer&lt;/a&gt; had it but with a few changes:&lt;br&gt;
&lt;br&gt;
public interface IImmutableList&amp;lt;T&amp;gt; : IEnumerable&amp;lt;T&amp;gt;&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; T Head { get; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IImmutableList&amp;lt;T&amp;gt; Tail { get; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bool IsEmpty { get; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bool IsCons { get; }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
As you can see, we have a head, a tail and a way to determine if this list is empty or if it is a cons.&amp;nbsp; All very important pieces to the puzzle.&amp;nbsp; This also inherits the IEnumerable&amp;lt;T&amp;gt; interface as well so that we can iterate this should we need to.&amp;nbsp; Now, let's go into the implementation details of the immutable list.&lt;br&gt;
&lt;br&gt;
public class ImmutableList&amp;lt;T&amp;gt; : IImmutableList&amp;lt;T&amp;gt;&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class EmptyList : ImmutableList&amp;lt;T&amp;gt; { }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class ConsList : ImmutableList&amp;lt;T&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal ConsList(T head, IEnumerator&amp;lt;T&amp;gt; enumerator)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Head = head;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.enumerator = enumerator;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private static readonly IImmutableList&amp;lt;T&amp;gt; empty = new EmptyList();&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IImmutableList&amp;lt;T&amp;gt; tail;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerator&amp;lt;T&amp;gt; enumerator; &lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public T Head { get; private set; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IImmutableList&amp;lt;T&amp;gt; Cons(T head, IImmutableList&amp;lt;T&amp;gt; tail)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new ConsList(head, tail.GetEnumerator());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IImmutableList&amp;lt;T&amp;gt; Cons(IEnumerator&amp;lt;T&amp;gt; enumerator)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return enumerator.MoveNext() ? new ConsList(enumerator.Current, enumerator) : empty;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public IImmutableList&amp;lt;T&amp;gt; Tail&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (enumerator != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tail = Cons(enumerator);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enumerator = null;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return tail;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsCons { get { return this is ConsList;&amp;nbsp; } }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsEmpty { get { return this is EmptyList;&amp;nbsp; } }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IImmutableList&amp;lt;T&amp;gt; Empty { get { return empty; } }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerator IEnumerable.GetEnumerator()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ((IEnumerable&amp;lt;T&amp;gt;) this).GetEnumerator();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public IEnumerator&amp;lt;T&amp;gt; GetEnumerator()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (IImmutableList&amp;lt;T&amp;gt; current = this; !current.IsEmpty; current = current.Tail)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield return current.Head;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
Now what I have done here is implemented two internal lists to represent a "cons" and one to represent an empty list.&amp;nbsp; This helps when determining whether the list is empty or not without having to check references and whether something is null.&amp;nbsp; Inside my ConsList&amp;lt;T&amp;gt;, I'm able to create a new instance of the ImmutableList&amp;lt;T&amp;gt; with the head value and the rest of the list.&amp;nbsp; &lt;br&gt;
&lt;br&gt;
The head of the list is just simply that, the first item.&amp;nbsp; When the tail property is called, I create a new IImmutableList&amp;lt;T&amp;gt; with my enumerator by calling the Cons method.&amp;nbsp; I also have properties which define and empty list, whether it is empty or whether it is a "cons".&amp;nbsp; Like I said, there's nothing hard about this.&amp;nbsp; &lt;br&gt;
&lt;br&gt;
Then I'm able to define a Sum and Length methods much as above with something like this:&lt;br&gt;
&lt;br&gt;
public static int Sum(this IImmutableList&amp;lt;int&amp;gt; list)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list.IsEmpty)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return list.Head + Sum(list.Tail);&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
public static int Length&amp;lt;T&amp;gt;(this IImmutableList&amp;lt;T&amp;gt; list)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list.IsEmpty)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1 + Length(list.Tail);&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
And then invoking this is pretty straight forward through the main method:&lt;br&gt;
&lt;br&gt;
static void Main(string[] args)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var enumerator = Enumerable.Range(1, 10).GetEnumerator();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var list = ImmutableList&amp;lt;int&amp;gt;.Cons(enumerator);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var sum = list.Sum();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var length = list.Length();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("List sum : {0}", sum);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("List length :{0}", length);&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
But what about tail recursion when doing list processing?&amp;nbsp; Let's walk through one more example of tail recursion with lists.&amp;nbsp; In this example, I'm going to go ahead and return the last item in the list.&amp;nbsp; It's a pretty simple and straight forward function which determines whether the list only has a head, or if it also has a tail, then recurse on the function again.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline;"&gt;F#&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
#light&lt;br&gt;
&lt;br&gt;
module ListExtensions =&lt;br&gt;
&amp;nbsp; let rec last = function&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | [] -&amp;gt; invalid_arg "last"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | [h] -&amp;gt; h&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | h::t -&amp;gt; last t&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;
[1;5;3;2;6;] |&amp;gt; ListExtensions.last |&amp;gt; print_any&lt;br&gt;
&lt;br&gt;
Now the C# version should look just as familiar to you.&amp;nbsp; Basically instead of the pattern matching, which I'd love to have in C#, I'm using if statements to determine whether I'm returning the head, or the evaluation of the Last function again until I wind down to the head.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline;"&gt;C#&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
public static T Last&amp;lt;T&amp;gt;(this ImmutableList&amp;lt;T&amp;gt; items)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(items.IsEmpty)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException("items");&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var tail = items.Tail;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return tail.IsEmpty ? items.Head : tail.Last();&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
var e1 = new List&amp;lt;int&amp;gt; {1,5,3,2,6}.GetEnumerator();&lt;br&gt;
var items = ImmutableList&amp;lt;int&amp;gt;.Cons(e1);&lt;br&gt;
var last = items.Last();&lt;br&gt;
Console.WriteLine("Last item: {0}", last);&lt;br&gt;
&lt;br&gt;
In the past I covered why tail recursion is important in my previous post.&amp;nbsp; Unfortunately, the C# code won't do much for you uniless the compiler is optimized for tail calls, or you are using the x64 version of Windows.&amp;nbsp; I have some of these samples in my &lt;a rel="nofollow" target="_blank" href="http://code.msdn.microsoft.com/FunctionalCSharp"&gt;Functional C# samples&lt;/a&gt; on &lt;a rel="nofollow" target="_blank" href="http://code.msdn.microsoft.com/"&gt;MSDN Code Gallery&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;Wrapping it Up&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
As you can see, recursion is a pretty interesting topic.&amp;nbsp; One of the best ways to avoid mutable state in your programs is through recursion.&amp;nbsp; I've shown some simple examples of where recursion can help to solve some of those issues.&amp;nbsp; This will wrap up a lot of the discussions about recursion and then I'm moving into such topics as memoization, continuations and so on.&amp;nbsp; The code samples will be available on the &lt;a rel="nofollow" target="_blank" href="http://code.msdn.microsoft.com/FunctionalCSharp"&gt;Functional C# Samples&lt;/a&gt; during this back to basics trip.
&lt;br&gt;
&lt;br&gt;
&lt;a rel="nofollow" target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://weblogs.asp.net/podwysocki/archive/2008/07/16/recursing-into-list-processing.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://weblogs.asp.net/podwysocki/archive/2008/07/16/recursing-into-list-processing.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=hgsLmk"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=hgsLmk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/337483297" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/337483297/recursing-into-list-processing.aspx</link>
      <pubDate>Tue, 15 Jul 2008 17:00:00 GMT</pubDate>
    <feedburner:origLink>http://weblogs.asp.net/podwysocki/archive/2008/07/16/recursing-into-list-processing.aspx</feedburner:origLink></item>
    <item>
      <title>VSLab R. Daneel released</title>
      <description>&lt;p&gt;
I just released the new release of VSLab codenamed R. Daneel. This release adds the package feature, an important element to build DSL and tools on top of VSLab. Packages are simply .NET assemblies with appropriate metadata used by VSLab to offer a dialog to manage them. Ok, ok you can code it, but it's handy to select which packages should be loaded, if at startup, and if you are lazy enough you can even ask for automatic namespace opening! &lt;/p&gt;
&lt;p&gt;
This is how package manager looks like: &lt;/p&gt;
&lt;a rel="nofollow" target="_blank" href="http://cvslab.di.unipi.it/vslab/blog/image.axd?picture=Screenshot-9.png"&gt;&lt;img src="http://cvslab.di.unipi.it/vslab/blog/image.axd?picture=Screenshot-9.png" alt="" width="600" height="420"/&gt;&lt;/a&gt; &lt;p&gt;
You can load packages interactively or flag them for startup. You have two assembly caches (different from the GAC so you are not required to understand strong naming) for packages, one in the VSLab installation dir, and the other in the user profile. I managed to start the UAC dialog on Vista to have packages installed under program files. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=Bki4ku"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=Bki4ku" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340503243" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340503243/VSLab-R-Daneel-released.aspx</link>
      <author>cisterni.nospam@nospam.di.unipi.it (cisterni)</author>
      <pubDate>Tue, 15 Jul 2008 11:45:00 GMT</pubDate>
    <feedburner:origLink>http://cvslab.di.unipi.it/vslab/blog/post/2008/07/16/VSLab-R-Daneel-released.aspx</feedburner:origLink></item>
    <item>
      <title>Help with study of functional programmers</title>
      <description>&lt;p&gt;Are you currently developing or maintaining a medium to large-sized&lt;br&gt;
program written in a functional language, such as Haskell, F#, OCaml,&lt;br&gt;
or Lisp? I'm a PhD student doing a study of functional programmers, as part of&lt;br&gt;
a research internship at Microsoft, and I would like the opportunity to look over&lt;br&gt;
your shoulder while you do debugging or coding on your project.&lt;/p&gt;
&lt;p&gt;I'm looking for people with at least a year's experience doing&lt;br&gt;
functional programming, and who are currently working on a real&lt;br&gt;
project (i.e. for some purpose other than learning functional&lt;br&gt;
programming). I'd simply come&lt;br&gt;
watch you work, and ask a few questions along the way. You'd do&lt;br&gt;
whatever you would normally be doing. If you're near Seattle or&lt;br&gt;
Portland, I'd come to your office for a couple of hours. If you're&lt;br&gt;
not near Seattle or Portland, then we'd set you up with LiveMeeting&lt;br&gt;
or some other remote screencast software so I can watch you from here.&lt;/p&gt;
&lt;p&gt;Obviously security concerns are an issue - I will not share any&lt;br&gt;
proprietary information that I learn about while visiting you. &lt;/p&gt;
&lt;p&gt;In exchange for your help, Microsoft will offer you your pick of free&lt;br&gt;
software off its gratuity list (which has about 50 items, including&lt;br&gt;
Visual Studio Professional, Word for Mac, XBOX 360 games) or any book&lt;br&gt;
from MS Press.&lt;/p&gt;
&lt;p&gt;We're doing this because expert functional programmers have not been&lt;br&gt;
studied much. We plan to share our findings through academic&lt;br&gt;
publications, to help tool developers create debugging tools that are&lt;br&gt;
genuinely helpful in real-world settings.&lt;/p&gt;
&lt;p&gt;I'm hoping to finish my observations by August 8th, so please contact&lt;br&gt;
me immediately if you're interested!&lt;/p&gt;
&lt;p&gt;Thank you,&lt;/p&gt;
&lt;p&gt;Chris Bogart&lt;br&gt;
425-538-3562&lt;br&gt;
t-chribo@microsoft.com&lt;/p&gt;
&lt;p&gt;(Correction 7/18/08: I was mistaken in my original posting: I *can* use&lt;br&gt;
participants in Europe as well as the US)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=14yGqL"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=14yGqL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/336369113" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/336369113/2896</link>
      <pubDate>Tue, 15 Jul 2008 07:40:04 GMT</pubDate>
    <feedburner:origLink>http://lambda-the-ultimate.org/node/2896</feedburner:origLink></item>
    <item>
      <title>ICFP 2008 Programming Contest</title>
      <description>&lt;p&gt;This year, for the first time, I participated in the &lt;a rel="nofollow" target="_blank" href="http://icfpcontest.org/"&gt;ICFP programming contest&lt;/a&gt;. This year's contest involved commanding a rover to navigate the Martian terrain: see the &lt;a rel="nofollow" target="_blank" href="http://smlnj.org/icfp08-contest/task.html"&gt;contest task description&lt;/a&gt;. It was tons of fun; I teamed up with &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/chrsmith/default.aspx"&gt;Chris Smith&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/lukeh/"&gt;Luke Hoban&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://diditwith.net/default.aspx"&gt;Dustin Campbell&lt;/a&gt; for an F# team. &lt;p&gt;In the end we submitted an entry that does pretty well on a variety of maps. Some features of our entry: &lt;ul&gt; &lt;li&gt;It is a heuristics-based approach. We have some general computations from what we learned about the world physics, but there are lots of hacks where we have arbitrary parameters like "multiply by 2.2" for no other reason than that seems to work well. And there are tons of if-then-else cases for various edge cases (e.g. if we think we are going too fast, then turn less sharply, unless about to crash, ...). &lt;li&gt;It is completely "local" - we use the current state for each movement, and do not plan for the long term. In general we either 'aim home' or else 'aim tangent to the next closest item blocking our path'. &lt;li&gt;We use a 'connected components' model to group together overlapping (or nearly-overlapping) obstacles. That way, we can steer around an entire group of nearby objects rather than trying to precisely weave between them. (I lifted code directly from &lt;a rel="nofollow" target="_blank" href="http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!220.entry"&gt;this post&lt;/a&gt;, hurray!) Our components are connected on an 'absolute' scale; it may have been better to group on a relative scale (the farther two distant objects are from you, the more likely it's an advantage to treat them as a single connected component despite any absolute distance between the two distant objects), but I only just thought of that now. I think we 'connect' any two craters that have only a two-rover-diameter-or-less distance between their perimeters. This avoids slowing down for precise steering through narrow gaps, but might also cause us to drive long distances around objects we could in fact squeeze through. &lt;li&gt;We only rarely slow down - if we are pointed away from home base, or if soon-after-the-next-tangent-we-are-currently-aiming-for we see an object coming soon right behind it. (Our heuristics for computing 'stopping distance' and 'how fast we can brake to avoid things' are decent, but not outstanding.) &lt;li&gt;We almost completely ignore Martians (very little logic to account for them). This is risky, but there is no good alternative. &lt;li&gt;We ignore many contest parameters, such the 'max lookahead' of our sensors. As a result, if we are given a fast rover who cannot see very far ahead, he will drive way too fast directly ahead into the unknown. &lt;li&gt;We are very good at turning quickly and smoothly, despite using a very ad-hoc heuristic approach that's only loosely based on the (supposed) physics of the task specification. &lt;li&gt;We did not create enough of our own sample maps, so I expect there are important cases we neglected. &lt;li&gt;There are lots of features we considered implementing but did not have time. For example, if we are trapped inside a connected component of obstacles with no line of sight out (imagine being inside the top-right of an @-shaped maze), I think we will get befuddled. We have 'tunnel vision', and may potentially drift gently into a boulder that is just barely to the side of the direction we are headed. We never consider using bouncing off boulders to our advantage. We thought a lot about a completely different approach that would just predict and simulate the future, and then search futures for best possible outcomes with very little heuristic strategy and mostly learning-on-the-fly, but did not have time/resources to try it. &lt;li&gt;We had lots of good, colorful debugging output.&lt;/ul&gt; &lt;p&gt;Of course we used our in-house latest-and-greatest F# bits, which are very useful. I haven't written any blogs in the past month, partly because I've been so busy adding features and fixing bugs for our upcoming CTP release of F#. I am looking forward to showing off all the hard work we've been doing on F#!&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8076776766069723920&amp;page=RSS%3a+ICFP+2008+Programming+Contest&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lorgonblog.spaces.live.com&amp;amp;GT1=lorgonblog"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=3fe0aV"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=3fe0aV" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/335458389" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/335458389/cns!701679AD17B6D310!277.entry</link>
      <pubDate>Mon, 14 Jul 2008 09:45:01 GMT</pubDate>
    <feedburner:origLink>http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!277.entry</feedburner:origLink></item>
    <item>
      <title>1.9.4.19 release</title>
      <description>&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;We've posted a minor update to version 1.9.4 (called 1.9.4.19). The change notice is in the README and below. There are three fixes/changes in this release&lt;/span&gt;&lt;/p&gt; 
&lt;p style="MARGIN-LEFT:36pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:Wingdings;"&gt;&lt;span style=""&gt;Ã&lt;span style="FONT:7pt 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;There was a glitch that prevented F# version 1.9.4.17 programs working well on Mono. A workarounds was mentioned here &lt;a rel="nofollow" target="_blank" href="http://laurent.le-brun.eu/site/index.php/2008/06/05/36-how-to-use-fsharp-1-9-4-17-on-mono"&gt;http://laurent.le-brun.eu/site/index.php/2008/06/05/36-how-to-use-fsharp-1-9-4-17-on-mono&lt;/a&gt;, though this workaround should now no longer be needed.&lt;/span&gt;&lt;/p&gt; 
&lt;p style="MARGIN-LEFT:36pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:Wingdings;"&gt;&lt;span style=""&gt;Ã&lt;span style="FONT:7pt 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;WebRequest.GetResponseAsync has been removed from FSharp.Core.dll, to help allow F# programs to be used on SIlverlight and other platforms where this method either doesnât exist or is in a non-standard place. See the release notes if you need this method (for example, it is needed for some examples in Expert F#)&lt;/span&gt;&lt;/p&gt; 
&lt;p style="MARGIN-LEFT:36pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:Wingdings;"&gt;&lt;span style=""&gt;Ã&lt;span style="FONT:7pt 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;We have fixed a compiler problem related to .NET 3.5 SP1 Beta (âstrange entry in exported types tableâ)&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;&lt;a rel="nofollow" target="_blank" href="http://research.microsoft.com/research/downloads/Details/7ac148a7-149b-4056-aa06-1e6754efd36f/Details.aspx"&gt;http://research.microsoft.com/research/downloads/Details/7ac148a7-149b-4056-aa06-1e6754efd36f/Details.aspx&lt;/a&gt;&amp;nbsp;(MSI)&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;&lt;a rel="nofollow" target="_blank" href="http://research.microsoft.com/research/downloads/Details/6f48a466-4294-4973-9e15-25e0ddff422f/Details.aspx"&gt;http://research.microsoft.com/research/downloads/Details/6f48a466-4294-4973-9e15-25e0ddff422f/Details.aspx&lt;/a&gt;&amp;nbsp;(ZIP)&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;Thanks&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:'Tahoma', 'sans-serif';"&gt;Don&lt;/span&gt;&lt;/p&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:8.5pt;COLOR:black;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;F# On Mono&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE:8.5pt;COLOR:black;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;&lt;/span&gt;&lt;/p&gt; 
&lt;ul type="disc"&gt;
&lt;li class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span style="FONT-SIZE:8.5pt;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;The Mono 2.0 profile for F# is now used. On Mono the F# compiler is now invoked using &lt;/span&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:'Courier New';"&gt;mono bin&amp;#92;fscp.exe&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE:8.5pt;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;. See the notes above for details of this. &lt;b&gt;NOTE&lt;/b&gt;: compiler startup times may be reduced on Mono because the Mono 1.9 doesn't support 'Ahead of Time Compilation' for its 2.0 profile. This won't normally be a problem if you're only using F# Interactive (&lt;/span&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:'Courier New';"&gt;fsi.exe&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE:8.5pt;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;). If it is a problem then see the instructions above for using the .NET 1.x profile compiler. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:8.5pt;COLOR:black;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;Library&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE:8.5pt;COLOR:black;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;&lt;/span&gt;&lt;/p&gt; 
&lt;ul type="disc"&gt;
&lt;li class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span style="FONT-SIZE:8.5pt;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;WebRequest.GetResponseAsync now removed from the F# library since its use of a System.Net method makes FSharp.Core.dll unusable on some .NET platforms. To use this method use: &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type System.Net.WebRequest with&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; member x.GetResponseAsync() =&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Async.BuildPrimitive(x.BeginGetResponse, x.EndGetResponse)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:12pt;FONT-FAMILY:'Verdana', 'sans-serif';"&gt;Bugs fixed&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:'Courier New';"&gt;2033&amp;nbsp;&amp;nbsp;&amp;nbsp; F# Compiler doesn't work with type forwarders found in .NET Framework 3.5 SP 1 Beta1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8732048" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=nU7w18"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=nU7w18" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/335400872" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/335400872/1-9-4-19-release.aspx</link>
      <pubDate>Mon, 14 Jul 2008 08:42:00 GMT</pubDate>
    <feedburner:origLink>http://blogs.msdn.com/dsyme/archive/2008/07/14/1-9-4-19-release.aspx</feedburner:origLink></item>
    <item>
      <title>Morning Coffee 167</title>
      <description>&lt;ul&gt;
&lt;li&gt;
If you're a gamer, you're probably already well aware that &lt;a rel="nofollow" target="_blank" href="http://www.xbox.com/en-US/community/events/e32008/"&gt;E3
is this week&lt;/a&gt;. The &lt;a rel="nofollow" target="_blank" href="http://majornelson.com/archive/2008/07/14/demo-too-human.aspx"&gt;Too
Human demo&lt;/a&gt; has already been released. I have a friend who's been working on "something"
that will be announced today (I think). &lt;li&gt;
Live Mesh folks &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/livemesh/archive/2008/07/11/service-update-new-build-new-features-coming-today-0-9-3103-2.aspx"&gt;pushed
out an update&lt;/a&gt; Friday. Among the new features is the ability to sync folders among
peers but NOT up to the cloud. This is cool because it means I can sync my many many
GB of pictures and music on my home machine backed up with Carbonite. This means I
can sync them without blowing thru my 5GB Mesh storage limit. &lt;li&gt;
It looks like there's a new F# drop - &lt;a rel="nofollow" target="_blank" href="http://research.microsoft.com/research/downloads/Details/7ac148a7-149b-4056-aa06-1e6754efd36f/Details.aspx"&gt;1.9.4.19&lt;/a&gt; - &lt;strike&gt;but
as usual there is no announcement or details as to what's new. Release notes guys,
look into it.&lt;/strike&gt;&amp;nbsp; UPDATE - Don Syme &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/dsyme/archive/2008/07/14/1-9-4-19-release.aspx"&gt;blogged
the release&lt;/a&gt;, and it's pretty minor. a .NET FX 3.5 SP1 bug fix, a fix for Mono,
and they removed WebRequest.GetResponseAsync to make F# work on Silverlight. And the
release notes are in the readme. My bad. &lt;li&gt;
Speaking of F#, it was "partially inspired" by &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/OCaml"&gt;OCaml&lt;/a&gt;,
so when I see papers related to OCaml, I immediately wonder if I an apply the described
techniques to F#. "&lt;a rel="nofollow" target="_blank" href="http://www.univ-orleans.fr/lifo/Members/David.Teller/publications/ml2008.pdf"&gt;Catch
me if you can, Towards type-safe, hierarchical, lightweight, polymorphic and efﬁcient
error management in OCaml&lt;/a&gt;" is one such paper. (via &lt;a rel="nofollow" target="_blank" href="http://lambda-the-ultimate.org/node/2892"&gt;LtU&lt;/a&gt;) &lt;li&gt;
Speaking of functional programming, Matthew Podwysocki &lt;a rel="nofollow" target="_blank" href="http://weblogs.asp.net/podwysocki/archive/2008/07/10/aspects-of-functional-programming-in-c-presentation-and-code.aspx"&gt;posted&lt;/a&gt; a
bunch of FP links as well as a Code Gallery Sample &lt;a rel="nofollow" target="_blank" href="http://code.msdn.microsoft.com/FunctionalCSharp/"&gt;on
FP in C#.&lt;/a&gt; Good stuff. &lt;li&gt;
As &lt;a rel="nofollow" target="_blank" href="http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx"&gt;per
Scott Guthrie&lt;/a&gt;, it looks like there's a new ASP.NET MVC drop coming this week. &lt;li&gt;
Based on posts by &lt;a rel="nofollow" target="_blank" href="http://blogs.tedneward.com/2008/07/11/So+You+Say+You+Want+To+Kill+XML.aspx"&gt;Ted
Neward&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.25hoursaday.com/weblog/2008/07/10/TheRevengeOfRPCGoogleProtocolBuffersAndFacebookThrift.aspx"&gt;Dare
Obasanjo&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://steve.vinoski.net/blog/2008/07/11/protocol-buffers-no-big-deal/"&gt;Steve
Vinoski&lt;/a&gt;, Google &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/protobuf/"&gt;Protocol Buffers&lt;/a&gt; sounds
like it's going to be a dud. Note, I haven't looked at it depth personally, I'm just
passing on opinions of some folks I read and trust. &lt;li&gt;
Speaking of Dare, both &lt;a rel="nofollow" target="_blank" href="http://www.25hoursaday.com/weblog/2008/07/14/ProjectCassandraFacebooksOpenSourceAlternativeToGoogleBigTable.aspx"&gt;he&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://perspectives.mvdirona.com/2008/07/12/FacebookReleasesCassandraAsOpenSource.aspx"&gt;James
Hamilton&lt;/a&gt; take a look at &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/the-cassandra-project/"&gt;Cassandra&lt;/a&gt; and
come away impressed. I wonder how easy it is to code against from Python and/or .NET? &lt;li&gt;
Bart de Smet has a &lt;a rel="nofollow" target="_blank" href="http://community.bartdesmet.net/blogs/bart/archive/2008/07/06/windows-powershell-through-ironruby-writing-a-custom-pshost.aspx"&gt;cool
sample&lt;/a&gt; of calling out to PowerShell from IronRuby via the backtick command. Pretty
cool, but it would even cooler to show how to call out to PS and return .NET objects
to Ruby (though that would probably not be spec compliant for the backtick command). &lt;li&gt;
Here's a MS code name I had never heard before - &lt;a rel="nofollow" target="_blank" href="https://connect.microsoft.com/site/sitehome.aspx?SiteID=642"&gt;Zermatt&lt;/a&gt;.
It's "a framework for implementing claims-based identity in your applications." (via &lt;a rel="nofollow" target="_blank" href="http://stevegilham.blogspot.com/2008/07/links-for-14-jul.html"&gt;Steve
Gilham&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://devhawk.net/aggbug.ashx?id=b93bcbe5-a9e9-42c3-a64a-3db4d92526c7"/&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=N0vXrE"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=N0vXrE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/335244114" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/335244114/Morning+Coffee+167.aspx</link>
      <pubDate>Mon, 14 Jul 2008 05:30:01 GMT</pubDate>
    <feedburner:origLink>http://devhawk.net/2008/07/14/Morning+Coffee+167.aspx</feedburner:origLink></item>
    <item>
      <title>F# 1.9.4.19 runs out of the box with Mono in Linux</title>
      <description>&lt;p&gt;Don Syme just &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/dsyme/archive/2008/07/14/1-9-4-19-release.aspx"&gt;announced a minor update to the F# environment&lt;/a&gt;, minor may be but of great interest to a certain community: it so happens that at some point F# stopped working properly in Linux, a &lt;a rel="nofollow" target="_blank" href="http://laurent.le-brun.eu/site/index.php/2008/06/05/36-how-to-use-fsharp-1-9-4-17-on-mono"&gt;workaround&lt;/a&gt; was published (and it actually works, but you've got to follow the instructions carefully). Well, not anymore, 1.9.4.19 works out of the box with Mono in Linux, you just have to download it, unzip it, and then happily type "mono fsi.exe":&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://weblogs.asp.net/blogs/esanchez/WindowsLiveWriter/F1.9.4.19runsoutoftheboxwithMonoinLinux_14947/FSharpMonoLinux_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="685" alt="FSharpMonoLinux" src="http://weblogs.asp.net/blogs/esanchez/WindowsLiveWriter/F1.9.4.19runsoutoftheboxwithMonoinLinux_14947/FSharpMonoLinux_thumb.jpg" width="824" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So now I've got one less pretext for not writing that book "Learning to program the functional way in an open source environment using a cool Microsoft technology" that will make me famous...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=roFnKB"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=roFnKB" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/335787669" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/335787669/f-1-9-4-19-runs-out-of-the-box-with-mono-in-linux.aspx</link>
      <pubDate>Sun, 13 Jul 2008 17:00:00 GMT</pubDate>
    <feedburner:origLink>http://weblogs.asp.net/esanchez/archive/2008/07/14/f-1-9-4-19-runs-out-of-the-box-with-mono-in-linux.aspx</feedburner:origLink></item>
    <item>
      <title>Under the hood</title>
      <description>&lt;p&gt;
I'm going crazy in refactoring and improving VSLab runtime. I'm trying to improve early design choices made while trying to find the right approach to implement it. This is important because the new package mechanism requires better design. I'm changing also core names and I've added a new VS command to be used to move as much code as possible into &lt;em&gt;fsi.exe&lt;/em&gt; instead than into the VS addin. The &lt;em&gt;FSIExec&lt;/em&gt; command allows F# functions to send a string to the F# interactive top-level for evaluation. This is a powerful form of meta-programming allowing F# code generating code fragments to be evaluated in the fashion of the eval function of dynamic languages.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=GmBpiY"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=GmBpiY" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/340503244" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/340503244/Under-the-hood.aspx</link>
      <category>Design</category>
      <author>cisterni.nospam@nospam.di.unipi.it (cisterni)</author>
      <pubDate>Sun, 13 Jul 2008 06:14:00 GMT</pubDate>
    <feedburner:origLink>http://cvslab.di.unipi.it/vslab/blog/post/2008/07/13/Under-the-hood.aspx</feedburner:origLink></item>
    <item>
      <title>The Countdown Puzzle</title>
      <description>Thank you for the comments. Brian has posted an optimisation to that function &lt;strong&gt;combine &lt;/strong&gt;that lets this solution run quick enough to win on TV. Sigma has pointed out that there are bits missing from the code because of the way I have pasted into the editor. And I have realised that I did not need to create a &lt;strong&gt;cons &lt;/strong&gt;function to do that section, I can create an anonymous function with fun just where I need it. So here is the final version:-&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#light&lt;br /&gt; &lt;br /&gt;type Op = | Add | Sub | Mul | Div&lt;br /&gt; &lt;br /&gt;type Expr = Val of int | App of Op * Expr * Expr&lt;br /&gt; &lt;br /&gt;let valid op x y =&lt;br /&gt; match (op, x, y) with&lt;br /&gt; | (Add, _, _) -&amp;gt; x &amp;lt; y&lt;br /&gt; | (Sub, x, y) -&amp;gt; x &amp;gt; y&lt;br /&gt; | (Mul, _, _) -&amp;gt; (x &amp;gt; 1) &amp;&amp; (y &amp;gt; 1) &amp;&amp; (x &amp;lt; y)&lt;br /&gt; | (Div, x, y) -&amp;gt; (y &amp;gt; 1) &amp;&amp; (x % y = 0)&lt;br /&gt; &lt;br /&gt;let apply op x y =&lt;br /&gt; match (op, x, y) with&lt;br /&gt; | (Add, x, y) -&amp;gt; x + y&lt;br /&gt; | (Sub, x, y) -&amp;gt; x - y&lt;br /&gt; | (Mul, x, y) -&amp;gt; x * y&lt;br /&gt; | (Div, x, y) -&amp;gt; x % y&lt;br /&gt; &lt;br /&gt;let rec eval e =&lt;br /&gt; match e with&lt;br /&gt; | Val n -&amp;gt; if n &amp;gt; 0 then [n] else []&lt;br /&gt; | App (op, e1, e2) -&amp;gt; [for x1 in eval e1 &lt;br /&gt; for x2 in eval e2 &lt;br /&gt; when valid op x1 x2 -&amp;gt; apply op x1 x2]&lt;br /&gt; &lt;br /&gt;let rec subs lst = &lt;br /&gt; match lst with&lt;br /&gt; | [] -&amp;gt; [[]]&lt;br /&gt; | x::xs -&amp;gt; let yss = subs xs in&lt;br /&gt; yss @ (List.map (fun lst -&amp;gt; x::lst) yss)&lt;br /&gt; &lt;br /&gt;let rec interleave x xs =&lt;br /&gt; match xs with&lt;br /&gt; | [] -&amp;gt; [[x]]&lt;br /&gt; | y::ys -&amp;gt; (x::y::ys) :: List.map (cons y) (interleave x ys)&lt;br /&gt; &lt;br /&gt;let rec perms lst =&lt;br /&gt; match lst with&lt;br /&gt; | [] -&amp;gt; [[]]&lt;br /&gt; | x::xs -&amp;gt; List.concat (List.map (interleave x) (perms xs))&lt;br /&gt; &lt;br /&gt;let choices lst = List.concat (List.map perms (subs lst))&lt;br /&gt; &lt;br /&gt;let rec split lst =&lt;br /&gt; match lst with&lt;br /&gt; | [] -&amp;gt; []&lt;br /&gt; | [_] -&amp;gt; []&lt;br /&gt; | x::xs -&amp;gt; ([x],xs)::[for (ls,rs) in split xs -&amp;gt; (x::ls,rs)]&lt;br /&gt; &lt;br /&gt;let ops = [Add; Sub; Mul; Div]&lt;br /&gt; &lt;br /&gt;let combine left right = &lt;br /&gt; [for o in ops &lt;br /&gt; let x = App (o, left, right)&lt;br /&gt; let e = (eval x)&lt;br /&gt; when not e.IsEmpty -&amp;gt; App (o, left, right)]&lt;br /&gt; &lt;br /&gt;let rec exprs lst =&lt;br /&gt; match lst with&lt;br /&gt; | [] -&amp;gt; []&lt;br /&gt; | [n] -&amp;gt; [Val n]&lt;br /&gt; | ns -&amp;gt; [for (ls,rs) in split ns&lt;br /&gt; for l in exprs ls&lt;br /&gt; for r in exprs rs&lt;br /&gt; for e in combine l r -&amp;gt; e]&lt;br /&gt; &lt;br /&gt;let op_to_str op =&lt;br /&gt; match op with&lt;br /&gt; | Add -&amp;gt; "+"&lt;br /&gt; | Sub -&amp;gt; "-"&lt;br /&gt; | Mul -&amp;gt; "x"&lt;br /&gt; | Div -&amp;gt; "/"&lt;br /&gt; &lt;br /&gt;let rec to_str expr =&lt;br /&gt; match expr with&lt;br /&gt; | Val n -&amp;gt; n.ToString()&lt;br /&gt; | App (op, e1, e2) -&amp;gt; "(" + (to_str e1) + (op_to_str op) + (to_str e2) + ")"&lt;br /&gt; &lt;br /&gt;let solutions ns n = [for nns in choices ns&lt;br /&gt; for e in exprs nns&lt;br /&gt; when eval e = [n] -&amp;gt; e]&lt;br /&gt; &lt;br /&gt;let print_solutions ns n = List.map to_str (solutions ns n)&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=8F2tPS"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=8F2tPS" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/334161970" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/334161970/countdown-puzzle.html</link>
      <author>Mike</author>
      <pubDate>Sat, 12 Jul 2008 23:27:00 GMT</pubDate>
    <feedburner:origLink>http://20riverside.blogspot.com/2008/07/countdown-puzzle.html</feedburner:origLink></item>
    <item>
      <title>F# Compiler</title>
      <description>F# is a variant of the ML programming language for .NET and has a core language similar to OCaml. F# is a mixed functional/imperative/object-oriented programming language excellent for medium/advanced programmers and for teaching. It also can be used to access hundreds of .NET libraries, and the F# code can be accessed from C# and other .NET languages. This release of F# includes a command-line compiler; “F# for Visual Studio,” which provides interactive syntax highlighting, parsing, type checki...
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=U7ikRI"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=U7ikRI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/333468129" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/333468129/rss_redirect.aspx</link>
      <pubDate>Fri, 11 Jul 2008 05:14:01 GMT</pubDate>
    <feedburner:origLink>http://research.microsoft.com/research/downloads/rss_redirect.aspx?0rc=d&amp;id=1297</feedburner:origLink></item>
    <item>
      <title>F# Compiler (zip)</title>
      <description>Available via zip distribution rather than msi. F# is a variant of the ML programming language for .NET and has a core language that is similar to OCaml. F# is a mixed functional/imperative/object-oriented programming language excellent for medium/advanced programmers and for teaching. It also can be used to access hundreds of .NET libraries, and the F# code can be accessed from C# and other .NET languages. This release of F# includes a command-line compiler; “F# for Visual Studio,” which pro...
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/planet_fsharp?a=OhRyUr"&gt;&lt;img src="http://feeds.feedburner.com/~a/planet_fsharp?i=OhRyUr" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_fsharp/~4/333468130" height="1" width="1"/&gt;</description>
      <link>http://feeds.feedburner.com/~r/planet_fsharp/~3/333468130/rss_redirect.aspx</link>
      <pubDate>Fri, 11 Jul 2008 05:13:04 GMT</pubDate>
    <feedburner:origLink>http://research.microsoft.com/research/downloads/rss_redirect.aspx?0rc=d&amp;id=1298</feedburner:origLink></item>
    <item>
      <title>Aspects of Functional Programming in C# Presentation and Code</title>
      <description>As noted before, I was scheduled to give a presentation on Aspects of Functional Programming in C# 3.0 yesterday at the &lt;a rel="nofollow" target="_blank" href="http://rocknug.org"&gt;Rockville .NET User Group (RockNUG)&lt;/a&gt;.&amp;nbsp; Unfortunately, before the presentations were to commence, the power went out and the event was scrapped for the evening.&amp;nbsp; Instead, the intention is to reconvene next month at t