F# (F Sharp) An Introductory Look By Kody Myers History “Mathematicians stand on each others' shoulders and computer scientists stand on each others' toes.” - Richard Hamming, 1968 Turing Award recipient Lambda Calculus (λ-calculus) • A formalism for representing functions. • Formulated by Alonzo Church in the 1930s. • Formed the basis of functional programming. Early Functional Languages • Lisp – 1958 • ISWIM (“If you See What I Mean”) – 1966 • Metalanguage (ML) – 1973 • Caml – 1985 • Haskell - 1990 "There are only two kinds of programming languages: those people always bitch about and those nobody uses.” - Bjarne Stroustrup, Creator of C++ “Why Nobody Uses Functional Languages” • Article appeared in the ACM SIGPLAN Notices newsletter in 1998 by Philip Wadler. • Wadler was one of the principal designers of Haskell. […] there are a large number of factors that hinder the widespread adoption of functional languages. To be widely used, a language should support interlanguage working, possess extensive libraries, be highly portable, have a stable and easy to install implementation, come with debuggers and profilers, be accompanied by training courses, and have a good track record on previous projects. -- Philip Wadler Don Syme • Principal Researcher at Microsoft Research, Cambridge, UK. • Was working on generics for C# for the .NET Framework. • Tasked with finding a functional language that would be a good fit with .NET. Haskell.NET? We had a go doing Haskell for .NET. We actually got a long way in doing that, but in the end there is quite a lot of dissonance between Haskell and .NET. - Don Syme Okay, How About OCaml.NET, Then? • OCaml: Objective Caml • Dialect of Caml. • Descendent of Metalanguage (ML). F# 1.0 – May 2005 • Functional programming • Discriminated unions • Records • Tuples • Pattern matching • Type abbreviations • Object programming • Structs • Signature files • Scripting files • Imperative programming • Modules (no functors) • Nested modules • .NET Interoperability F# 2.0 – April 2010 • Active patterns • Units of measure • Sequence expressions • Asynchronous programming • Agent programming • Extension members • Named arguments • Optional arguments • Array slicing • Quotations • Native interoperability • Computation expressions F# 3.0 – August 2012 • Type providers • LINQ query expressions • CLIMutable attribute • Triple-quoted strings • Auto-properties • Provided units-of-measure Present Day F# 3.1 – October 2013 • Named union type fields • Extensions to array slicing • Type inference enhancements **Specification not yet finalized Currently Active Keywords abstract downto if mutable return use! and elif in namespace return! val as else inherit new select void assert end inline not static when base exception interface null struct while begin extern internal of then with class false lazy open to yield default finally let or true yield! delegate for let! override try do fun match private type done function member public upcast downcast global module rec use Inactive Keywords From OCaml asr lsl mod land lsr sig lor lxor Reserved Keywords for Future Use atomic continue method sealed break eager mixin tailcall checked event object trait component external parallel virtual const fixed process volatile constraint functor protected constructor include pure Introducing your “let-saber” “A more elegant weapon for a more civilized age.” - Obi Wan Kenobi, Star Wars: A New Hope “let” Us Begin let hello = “Hello World!” let pi = 3.1415926 let isRunning = false let numList = [1 .. 10] let vehicle = (2013, “Ford”, “Explorer”, true) let userId = System.Guid.NewGuid() Wow, Those Puns Were Terrible • Yeah, you’re probably right. • Time to lose these boring slides for awhile. Advantages of F# • Highly readable, especially for developers who are already with functional languages and .NET programming. • Highly writeable, especially developing with the help of the Visual Studio IDE. • Highly reliable, thanks to the tried and heavily-tested libraries of the .NET Framework. • Moderately portable to other, non-Windows platforms, thanks to the Mono project. Disadvantages of F# • Functional languages require an uncomfortable adjustment to the way programmers normally think about problems. • Sacrifices a measure of performance in favor of reliability. • Hasn’t garnered a comparable amount of confidence as the other more wellestablished languages of the .NET Framework. • Practical solutions are limited to very specific class of problems. The Future: F# 4.0+ • Printf on unitized values • Extended #if grammar • Extension property initializers • Support for 'fixed' • Non-null provided types • Tailcall attribute • Class names as functions • Multiple interface instantiations • Static parameters for provided methods • Optional type args • Printf interpolation • Params dictionaries A Sampling of Practical Applications • Unit conversion • Power generation load balancing and scheduling • Insurance risk engine • Game rules engine • Website click prediction • Forensic image comparison • Genome sequencing • Game player ranking let isFSharpUseful = true Source: http://fsharp.org/testimonials/ Suggested Resources • Try F# – tryfsharp.org • The F# Software Foundation – fsharp.org • F# for fun and profit – fsharpforfunandprofit.com