What is F#?
F# is a new functional programming language that is being developed here at Microsoft. Don Syme invented the language. Currently, the Managed Languages team is taking Don's work and turning F# into one of our production languages, alongside C#, Visual Basic, IronRuby, and IronPython. Since I find the project interesting, I've undertaken to learn F#. Don Syme invented the language. Currently, the Managed Languages team is taking Don's work and turning F# into one of our production languages, alongside C#, Visual Basic, IronRuby, and IronPython. Since I find the project interesting, I've undertaken to learn F#.
I'm learning F#
My Comparative Languages class back at Virginia Tech was one of my all-time favorites, but it involved only a meager treatment of functional programming. I wrote a little Scheme, but that was it. To learn F#, I expect my biggest task is simply to understand functional programming in general: to understand how it differs from imperative and object-oriented programming. To this end, I chose a language feature of F# to investigate: the forward pipe. Also, I chose an arbitrary task to code up, to flex my limited F# knowledge.
What is the Forward Pipe?
In F#, simple function calls in F# look like this:
String.split [' '] text
In this case, String.split is the function, and [''] and text are the parameters. The parameters come after the function name. The Forward Pipe operator ( |> ) changes this order.With the Forward Pipe, a parameter preceding the function name is "piped" to the function, like this:
text |> String.split['']
It's important to note that the piped parameter is the last parameter in order (so text is ordered after [''] in this example).
More examples of the forward pipe can be seen in this code:
#light //you may have to change this reference path: #I @"D:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\" #r @"WindowsBase.dll" #r @"PresentationCore.dll" #r @"PresentationFramework.dll" //opening namespaces open System open System.Windows open System.Windows.Controls //simple object manipulation let win = new Window() win.Title <- "Keats" win.Show() //function definition let labFromText text = let newLab = new Label() newLab.Content <- text newLab //function definition let surroundWithPanel objs = let pan = new StackPanel() List.iter ( fun x -> pan.Children.Add( x ) |> ignore ) objs pan //lots of forward pipes here: win.Content <- "When I have fears that I may cease to be" |> String.split [' '] |> List.map labFromText |> surroundWithPanel
//this code allows the app to be compiled and run: #if COMPILED [<STAThread()>] do let app = new Application() in app.Run() |> ignore #endif