An introduction to F# (part 2) Bogdan Brinzarea-Iamandi Banca Romaneasca 25 February 2010
TopicCovered Today History22 february 2010 From imperative to functional22 february 2010 Fundamentals22 february 2010 Data structures22 february 2010 Pattern Matching22 february 2010 Immutability vs. Mutability22 february 2010 Object Oriented Programming22 february 2010 Async and Parallel Programming Unit testing
ProblemSolution I/O bound applicationAsynchronous processing CPU bound applicationParallel and distributed processing Freezing UIAsynchronous processing Sharing stateImmutability
Working with threads is difficult Synchronizing and sharing state are difficult Introducing bugs is easy The code is complicated
Multiple active evaluations (threads computing results) Multiple pending reactions (callbacks and agents waiting for events and messages)
Not useful for asynchronous operations Imperative programming Sharing mutable data between threads Cancellations Raising events in the right thread
Optimization opportunities Easily transferable between threads Reliability
Ease of change Cancellation checking Simple resource management Exception propagation
Creates async objects These tasks can be run In the current thread In a background thread In parallel using fork/join mechanism As continuations
Takes async objects and creates async tasks Uses QueueUserWorkItem Fork/join pattern Does not report progress seq > -> Async
Runs synchronous computation Waits for the result Batch processing jobs Matrix multiplication
Starts and ends in the same thread Useful for UI updating Continuations for: Complete Exception Cancellation
let! for async method calls The thread is suspended until the result in available The rest of the code runs as a continuation use! resource disposing equivalent of let!
Leverage parallel hardware capabilities Data parallel programming with PLinq Easy to implement Abstracts away complexity Transparent partition and merge operations Works on seq and IEnumerable Task parallel programming using the new Task Parallel Library in.NET 4.0
Erlang message passing style “An actor is a computational entity that, in response to a message it receives, can concurrently: ▪ send a finite number of messages to other actors; ▪ create a finite number of new actors; ▪ designate the behavior to be used for the next message it receives.”
Asynchronous message passing Can have even 1000 agents Agents are lightweight Based on async programming State isolation between agents No concurrency and data races
NUnit xUnit.net
FsUnit based on NUnit FsCheck inspired from Haskell’s QuickCheck FsTest based on xUnit.net NaturalSpec based on NUnit FsSpec readable DSL
Expert F# by Don Syme Programming F# by Chris Smith CTO Corner - HubFS Matthew Podwysocki Don Syme Chris Smith