Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Introduction to F#<br />Talbott Crowell<br />
Functional programming has been around a long time<br />Not new<br />Long history<br />Functional programming is safe<br /...
1930’s: lambda calculus (roots)<br />1956: IPL (Information Processing Language) “the first functional language<br />1958:...
Side effects<br />Modifies some state<br />Has observable interaction with calling functions <br />Has observable interact...
Language Evolution (Simon Payton-Jones)<br />C#, VB, Java, C are imperative programming languages.  Very useful but can ch...
Long relegated to academia<br />Industrial and commercial applications<br />Scheme, Erlang, OCaml, Haskell<br />F# at Gran...
Functional language developed by Microsoft Research<br />By Don Syme and his team, who productized Generics<br />Based on ...
Interactive Scripting<br />Good for prototyping<br />Succinct = Less code<br />Type Inference<br />Strongly typed, strict<...
Multi-Paradigm<br />Functional Programming<br />Imperative Programming<br />Object Oriented Programming<br />Language Orie...
Dynamically compiles code on the fly<br />Example:<br />Demo<br />F# Interactive<br />open System.Drawing;; <br />open Sys...
Type inference<br />Expressions<br />F# Basics<br />let x = 5<br />let y = 5.0 <br />let files = Directory.GetFiles(@&quot...
Function<br />Anonymous functions<br />F# Functions<br />let sqr x = x * x<br />sqr 5<br />(fun x -&gt; x * x) 5 <br />
The |&gt; Combinator “Pipe Forward”<br /> Example<br />F# Combinators<br /> x |&gt; f          is the same as        f x<b...
Partial functions<br />Don’t have to pass all parameters at once<br />Curried Functions<br />letDivideBy y x = x / y<br />...
Pass curried function to another function<br />Power of Curried Functions<br />letDivideBy y x = x / y<br />letnumbers = [...
Compare with VB<br />Function DivideBy(ByVal y As Single, _<br />ByVal x As Single) As Single<br />    Return x / y<br />E...
used to group values together without creating a class or struct<br />Tuple<br />Tuple as a function parameter<br />#light...
Similar to Object Oriented inheritance<br />Useful in pattern matching<br />Discriminated Unions<br />type Suit =<br />  |...
Discriminated Unions cont.<br />type Suit =<br />  | Spades<br />  | Hearts<br />  | Clubs<br />  | Diamonds<br />type Car...
Used often in F# programs<br />Syntax (source: http://en.wikibooks.org/wiki/F_Sharp_Programming/Pattern_Matching_Basics )<...
Mouse event handler in DirectX Demo<br />Checking mouse button and shift key modifiers<br />Pattern Matching Example<br />...
FSharp Samples v0.2 <br />The DirectX Demo<br />More F# Interactive<br />http://code.msdn.microsoft.com/fsharpsamples<br />
The Power Wall<br />Manycore FUD<br />Free lunch is over<br />Parallel programming in .NET<br />Where F# fits into this fu...
The Power Wall: CPU Clock Speed<br />From Katherine Yelick’s “Multicore: Fallout of a Hardware Revolution”<br />
Fear, Uncertainty, and Doubt<br />Talbott’s FUD slide: why you should be concerned<br />Moore’s Law<br />Predicted in 1965...
Source: Wikipedia entry for Larrabee (GPU)<br />Intel Larrabee<br />
Free lunch is over<br />Programs are not doubling in speed every couple of years for free anymore<br />We need to start wr...
Libraries and Framework Improvements<br />TPL (Included in .NET 4.0)<br />PLINQ<br />Programming Approaches<br />Functiona...
Parallel Programming in the .NET Framework 4 Beta 2<br />
“F# is, technically speaking, neutral with respect to concurrency - it allows the programmer to exploit the many different...
Problem<br />Resize a ton of images<br />Demo of Image Processor<br />let files = Directory.GetFiles(@&quot;C:imagesorigin...
Asynchronous Workflows<br />let FetchAsync(file:string) =<br />async {<br />        use stream = File.OpenRead(file)<br />...
Almost 2x on 2 cores<br />About 3.5x faster on 8 cores<br />Demo Asynchronous Workflow<br />
Thank you for attending Intro to F#Questions?<br />F# User Group<br />http://fsug.org<br />Twitter: @FSUG<br />Talbott Cro...
Upcoming SlideShare
Loading in …5
×

Introduction to F#

3,714 views

Published on

Introduction to F# for the New England Visual Basic Professionals User Group.

Published in: Technology

Introduction to F#

  1. 1. Introduction to F#<br />Talbott Crowell<br />
  2. 2. Functional programming has been around a long time<br />Not new<br />Long history<br />Functional programming is safe<br />A concern as we head toward manycore and cloud computing<br />Functional programming is on the rise<br />Why another language?<br />
  3. 3. 1930’s: lambda calculus (roots)<br />1956: IPL (Information Processing Language) “the first functional language<br />1958: LISP “a functional flavored language”<br />1962: APL (A Programming Language)<br />1973: ML (Meta Language)<br />1983: SML (Standard ML)<br />1987: Caml (Categorical Abstract Machine Language ) and Haskell<br />1996: OCaml (Objective Caml)<br />Functional programming has been around a long time<br />
  4. 4. Side effects<br />Modifies some state<br />Has observable interaction with calling functions <br />Has observable interaction with the outside world<br />Example: a function or method with no return value<br />Most functional languages encourage programmers to avoid side effects<br />Haskell (a “pure” functional language) restricts side effects with a static type system<br />Functional programming is safe<br />
  5. 5. Language Evolution (Simon Payton-Jones)<br />C#, VB, Java, C are imperative programming languages. Very useful but can change the state of the world at anytime creating side effects.<br />Nirvana! Useful and Safe<br />F#<br />Haskell is Very Safe, but not very useful. Used heavily in research and academia, but rarely in business .<br />http://channel9.msdn.com/posts/Charles/Simon-Peyton-Jones-Towards-a-Programming-Language-Nirvana/<br />
  6. 6. Long relegated to academia<br />Industrial and commercial applications<br />Scheme, Erlang, OCaml, Haskell<br />F# at Grange Insurance, Ohio: http://bit.ly/GrangeFSharp<br />F# used by XBox Live Trueskill: http://bit.ly/trueskill<br />DSL’s<br />Mathematica<br />XSLT<br />Excel can be viewed as a functional programming language<br />Functional programming on the rise<br />
  7. 7. Functional language developed by Microsoft Research<br />By Don Syme and his team, who productized Generics<br />Based on OCaml (influenced by C# and Haskell)<br />History<br />2002: F# language design started<br />2005 January: F# 1.0.1 releases to public<br />Not a product. Integration with VS2003<br />Works in .NET 1.0 through .NET 2.0 beta, Mono<br />2005 November: F# 1.1.5 with VS 2005 RTM support<br />2009 October: VS2010 Beta 2, CTP for VS2008 & Non-Windows users<br />2010: F# is “productized” and baked into VS 2010<br />What is F#<br />
  8. 8. Interactive Scripting<br />Good for prototyping<br />Succinct = Less code<br />Type Inference<br />Strongly typed, strict<br />Automatic generalization (generics for free)<br />Few type annotations<br />1st class functions (currying, lazy evaluations)<br />Pattern matching<br />Key Characteristics of F#<br />
  9. 9. Multi-Paradigm<br />Functional Programming<br />Imperative Programming<br />Object Oriented Programming<br />Language Oriented Programming<br />Task Oriented Programming<br />F# is not just Functional<br />
  10. 10. Dynamically compiles code on the fly<br />Example:<br />Demo<br />F# Interactive<br />open System.Drawing;; <br />open System.Windows.Forms;; <br />let myform = new Form(Text=&quot;Hello Everybody&quot;, Visible=true);; <br />myform.BackColor &lt;- Color.Blue;;<br />let mybutton = new Button(Text = &quot;Click Me&quot;);;<br />myform.Controls.Add(mybutton);; <br />mybutton.BackColor &lt;- Color.White;; <br />mybutton.Click.Add(fun _ -&gt; MessageBox.Show(&quot;Clicked&quot;) |&gt; ignore);;<br />
  11. 11. Type inference<br />Expressions<br />F# Basics<br />let x = 5<br />let y = 5.0 <br />let files = Directory.GetFiles(@&quot;C:imagesoriginal&quot;)<br />let x = 5 * 5<br />let y = 5.0 / 3.0<br />let width = image.Width / 8 <br />
  12. 12. Function<br />Anonymous functions<br />F# Functions<br />let sqr x = x * x<br />sqr 5<br />(fun x -&gt; x * x) 5 <br />
  13. 13. The |&gt; Combinator “Pipe Forward”<br /> Example<br />F# Combinators<br /> x |&gt; f is the same as f x<br /> let sqr x = x * x<br />sqr x<br /> 5 |&gt; sqr<br />
  14. 14. Partial functions<br />Don’t have to pass all parameters at once<br />Curried Functions<br />letDivideBy y x = x / y<br />let result = DivideBy 2.0 3.0<br />valDivideBy : float -&gt; float -&gt; float<br />val result : float = 1.5<br />let HalfOf = DivideBy 2.0<br />let result2 = HalfOf 3.0<br />valHalfOf : (float -&gt; float)<br />val result2 : float = 1.5<br />
  15. 15. Pass curried function to another function<br />Power of Curried Functions<br />letDivideBy y x = x / y<br />letnumbers = [1.0; 2.0; 3.0]<br />let result3 = List.map (DivideBy 2.0) numbers<br />valDivideBy : float -&gt; float -&gt; float<br />val numbers : float list = [1.0; 2.0; 3.0]<br />val result3 : float list = [0.5; 1.0; 1.5]<br />
  16. 16. Compare with VB<br />Function DivideBy(ByVal y As Single, _<br />ByVal x As Single) As Single<br /> Return x / y<br />End Function<br />Sub Main()<br /> Dim numbers = New Single() {1.0, 2.0, 3.0}<br /> Dim result3 As New List(Of Single)<br /> For Each number In numbers<br /> result3.Add(DivideBy(2.0, number))<br /> Next<br />End Sub<br />
  17. 17. used to group values together without creating a class or struct<br />Tuple<br />Tuple as a function parameter<br />#light<br />open System<br />let swap (x, y) = (y, x)<br />let rotate (x, y, z) = (y, z, x)<br />let circleDetails radius =<br /> let area = Math.PI * (radius * radius)<br /> let circumference = 2.0 * Math.PI * radius<br /> (area, circumference)<br />let result1 = swap(3, 2)<br />let result2 = rotate(5, 6, 7)<br />let details = circleDetails 4.0<br />let (a, c) = details<br />Tuple as a return value<br />Tuple as left side of an assignment<br />
  18. 18. Similar to Object Oriented inheritance<br />Useful in pattern matching<br />Discriminated Unions<br />type Suit =<br /> | Spades<br /> | Hearts<br /> | Clubs<br /> | Diamonds<br />let suits = [Spades; Hearts; Clubs; Diamonds]<br />
  19. 19. Discriminated Unions cont.<br />type Suit =<br /> | Spades<br /> | Hearts<br /> | Clubs<br /> | Diamonds<br />type Card =<br /> | Ace of Suit<br /> | RankCard of int * Suit<br /> | Jack of Suit<br /> | Queen of Suit<br /> | King of Suit<br /> | Joker<br />let card1 = Ace(Diamonds)<br />let card2 = RankCard(3, Spades)<br />let card3 = Joker<br />
  20. 20. Used often in F# programs<br />Syntax (source: http://en.wikibooks.org/wiki/F_Sharp_Programming/Pattern_Matching_Basics )<br />Pattern Matching<br />
  21. 21. Mouse event handler in DirectX Demo<br />Checking mouse button and shift key modifiers<br />Pattern Matching Example<br />match b.Button, Form.ModifierKeys with <br /> | MouseButtons.Left, Keys.Shift -&gt; view.AdjustZoom(dx,dy)<br /> | MouseButtons.Left, _ -&gt; view.AdjustYawPitchRoll(dx,dy)<br /> | _ -&gt; view.AdjustFocus(dx,dy) <br />
  22. 22. FSharp Samples v0.2 <br />The DirectX Demo<br />More F# Interactive<br />http://code.msdn.microsoft.com/fsharpsamples<br />
  23. 23. The Power Wall<br />Manycore FUD<br />Free lunch is over<br />Parallel programming in .NET<br />Where F# fits into this future<br />F# and Impact on the Future<br />
  24. 24. The Power Wall: CPU Clock Speed<br />From Katherine Yelick’s “Multicore: Fallout of a Hardware Revolution”<br />
  25. 25. Fear, Uncertainty, and Doubt<br />Talbott’s FUD slide: why you should be concerned<br />Moore’s Law<br />Predicted in 1965 that transistor density in semiconductor chips would double every 18 months<br />Clock speed on chips plateaued in 2005 at 3 GHz due to the “Power Wall”<br />Intel and AMD have now begun doubling cores every 18 months to keep up with Moore’s Law<br />AMD Opteron Istanbul and Intel Xeon have 6 cores per socket used in Servers<br />Dell Studio XPS (2009 price of $750) comes with Intel i7 with 4 cores with 2 way hyper-threading (8 virtual cores)<br />Intel Larrabee on the horizon with 32 cores with 4 way hyper-threading (128 virtual cores)<br />FUD<br />
  26. 26. Source: Wikipedia entry for Larrabee (GPU)<br />Intel Larrabee<br />
  27. 27. Free lunch is over<br />Programs are not doubling in speed every couple of years for free anymore<br />We need to start writing code to take advantage of many cores<br />Currently painful and problematic to take advantage of many cores because of shared memory, locking, and other imperative programming techniques<br />Problem<br />
  28. 28. Libraries and Framework Improvements<br />TPL (Included in .NET 4.0)<br />PLINQ<br />Programming Approaches<br />Functional programming<br />Immutable data<br />No side effects<br />Task oriented programming<br />Solution<br />
  29. 29. Parallel Programming in the .NET Framework 4 Beta 2<br />
  30. 30. “F# is, technically speaking, neutral with respect to concurrency - it allows the programmer to exploit the many different techniques for concurrency and distribution supported by the .NET platform” <br />F# FAQ: http://bit.ly/FSharpFAQ<br />Functional programming is a primary technique for minimizing/isolating mutable state<br />Asynchronous workflows make writing parallel programs in a “natural and compositional style”<br />F# and Multi-Core Programming<br />
  31. 31. Problem<br />Resize a ton of images<br />Demo of Image Processor<br />let files = Directory.GetFiles(@&quot;C:imagesoriginal&quot;)<br />for file in files do<br /> use image = Image.FromFile(file)<br /> use smallImage = ResizeImage(image)<br /> let destFileName = DestFileName(&quot;s1&quot;, file)<br />smallImage.Save(destFileName)<br />
  32. 32. Asynchronous Workflows<br />let FetchAsync(file:string) =<br />async {<br /> use stream = File.OpenRead(file)<br /> let! bytes = stream.AsyncRead(intstream.Length)<br /> use memstream = new MemoryStream(bytes.Length)<br />memstream.Write(bytes, 0, bytes.Length)<br /> use image = Image.FromStream(memstream)<br /> use smallImage = ResizeImage(image)<br /> let destFileName = DestFileName(&quot;s2&quot;, file)<br />smallImage.Save(destFileName)<br /> }<br />let tasks = [for file in files -&gt; FetchAsync(file)]<br />let parallelTasks = Async.Parallel tasks<br />Async.RunSynchronouslyparallelTasks<br />
  33. 33. Almost 2x on 2 cores<br />About 3.5x faster on 8 cores<br />Demo Asynchronous Workflow<br />
  34. 34. Thank you for attending Intro to F#Questions?<br />F# User Group<br />http://fsug.org<br />Twitter: @FSUG<br />Talbott Crowell, ThirdM.com<br />http://talbottc.spaces.live.com<br />Twitter: @Talbott<br />

×