Book Image

Mastering F#

By : Alfonso García-Caro Núñez, Suhaib Fahad
Book Image

Mastering F#

By: Alfonso García-Caro Núñez, Suhaib Fahad

Overview of this book

F# is a multi-paradigm programming language that encompasses object-oriented, imperative, and functional programming language properties. Now adopted in a wide range of application areas and is supported both by industry-leading companies who provide professional tools and by an active open community, F# is rapidly gaining popularity as it emerges in digital music advertising, creating music-focused ads for Spotify, Pandora, Shazam, and anywhere on the web. This book will guide you through the basics and will then help you master F#. The book starts by explaining how to use F# with Visual Studio, file ordering, and the differences between F# and C# in terms of usage. It moves on to explain the functional core of F# such as data types, type declarations, immutability, strong type interference, pattern matching, records, F# data structures, sequence expressions, and lazy evaluation. Next, the book takes you through imperative and asynchronous programming, F# type providers, applications, and testing in F#. Finally, we look into using F# with distributed programming and using F# as a suitable language for data science. In short, this book will help you learn F# for real-world applications and increase your productivity with functional programming.
Table of Contents (16 chapters)

Actor programming with MailboxProcessor


The actor programming model is a concurrent programming technique that provides a powerful mechanism to encapsulate several concurrency features. The key principles of the actor model are as follows:

  • No shared state between actors
  • Async message passing between clients to actor or between actors
  • Mailbox to buffer incoming messages
  • React to received messages by executing function

The F# MailboxProcessor class is the implementation of the actor model in FSharp.Core, and it is essentially a dedicated message queue running its own thread. We can use the API for MailboxProcessor to Post/Receive messages synchronously or asynchronously. We can also consider it an agent with an internal state machine. Let's take look at our first async agent:

let agent = 
   MailboxProcessor.Start(fun inbox -> 
     async { while true do 
               let! msg = inbox.Receive() 
               printfn "got message '%s'" msg } ) 
> agent.Post "Hello...