3 min read
·
By Runar Ovesen Hjerpbakk
·
December 21, 2020
My first post in this year's calendar on some improved functional aspects of C# was immediately met with some well deserved snark:
Well, no, but I still love C# more 😘
However, F# is a fun and well-designed language with a loyal following, OK tooling support from Microsoft and has one great advantage over other primarily functional languages: the entire .Net ecosystem is available to us! And this naturally includes Xamarin and the power to easily write modern mobile apps using your favorite language.
As a language F# has a couple of striking benefits over C#:
Getting started is as easy as downloading Visual Studio and choosing F# as our language of choice in the New Project
wizard.
With the tooling in place, what advantages will F# give us on mobile?
On the naive face of it, not much.
Take iOS for example, with its heavy use of MVC. Consider the following example of a ViewController
containing a pristine green background with a simple heartfelt label:
open System
open Foundation
open UIKit
[<Register ("ViewController")>]
type ViewController (handle:IntPtr) =
inherit UIViewController (handle)
override x.ViewDidLoad () =
base.ViewDidLoad ()
let label = new UILabel(x.View.Frame)
label.BackgroundColor <- UIColor.Green // Mutation
label.Text <- "F# ❤️" // Mutation
x.View.Add label
One screen, one color, one label and TWO mutations.
A discourageable start, but there is hope.
A year ago, I wrote about using the Fabulous framework and MVU pattern on this very blog, thus making mobile go fully functional.
As fabulous as Fabulous can be, this road requires commitment. From us, our team and preferably out organization too! The thinking behind MVU is markedly different from MVVM or MVC and needs to be understood for the pattern to be more effective and less error prone than its older friends.
MVU is best utilized in a green field setting or within logically self-contained parts of the app.
Since F# easily interfaces with other .Net languages, we don't need to go all in.
A safe introduction to mobile development with F# is to model the domain using F#, and use C# (and XAML) to describe and interact with the UI-layer. In MVVM and MVC both, the M might better be described by F#'s richer type system.
In addition, this approach is easier on our peers, since modeling in F# can be done piecemeal even in mature code bases. Should be an easy sell!
To summarize, both iOS' and Android's UI frameworks are naturally object oriented, same for Xamarin Forms. Thus, F# is not a natural drop-in replace for C# when writing mobile apps, but rather an excellent option for modeling our domain. Giving expressive power, ease of testing and clean code where it matters the most: the business rules and their data.
Unless off course we go Full Elmish.