I don't remember exactly where, but some years ago I've come across a book that said something like -- A "complete" programmer must know the 3 main programming styles, 1. C-based (C#, Java C++ etc) 2. Scripting (Perl etc) and 3. Functional (Haskell, OCaml etc). Each style requires a different mind- set when writing code. I started out as a Perl programmer (i know it's weird that my first language was Perl... ), moved on to C++ and now I'm doing .NET (C# and BizTalk mainly). So, I've covered the first 2 "styles" and that leaves just functional programming.
I've always been interested with functional programming but I somehow I've always found an excuse not to try it. Add to that the facts that
- Going from OO to functional programming is hard. By that I mean the learning curve is very steep!!!
- I didn't want to throw away my existing knowledge on C#
- I didn't want to throw away the libraries I've compiled and written over the years.
- There are no F# jobs!! (at least there's none in Singapore)

A few weeks back Microsoft announced that it is productizing F#. It is now going to be a supported .NET language. That is really great because now my excuses #2 and #3 are no longer valid! Excuses #1 and #4 though it still has some weight, it is not enough anymore to keep me from learning functional programming with F#. Yes, there will always be a learning curve. And, the jobs...well, hopefully the bio-tech companies will soon adapt F# given that because of its functional nature, Microsoft is marketing it as a language for scientific reasearch and development.
F# is not a pure functional language like Haskell i.e. it allows side-effects. This is perfectly fine (I'm not a purist) because this is actually allows interoperability with other .NET libraries. Which means coding in F# will in no way greatly reduce my productivity.
For 2 weeks now, I've been reading up on F# while travelling to and from the office. Below is my first F# code. Check out how System.Windows.Forms controls are available from the code.

#light
open System
open System.Drawing
open System.Windows.Forms
open System.Windows.Forms.Design
let label =
let temp = new Label()
do temp.Name <- "label1"
do temp.Size <- new System.Drawing.Size(35, 13);
do temp.Text <- "Hello F#"
do temp.AutoSize <- true
do temp.Location <- new Drawing.Point(26,27)
temp
let form =
let temp = new Form()
do temp.Name <- "ErikForm"
do temp.Text <- "EriKForm"
do temp.ClientSize <- new System.Drawing.Size(292, 266);
do temp.Controls.Add(label)
temp
let ticker =
let temp = new Timer()
temp.Enabled <- true
temp.Interval <- 1000
temp.Tick.Add(fun _ -> label.Text <- DateTime.Now.ToLongTimeString())
do Application.Run(form)