Born in a research lab, raised in the enterprise and now a fully open source, cross-platform language for the Cloud and Web, F# has been a key part of the transformation of programming since the early 2000s. Programming now regularly incorporates both functional and object programming techniques, with compositionality, succinctness, methodology and delivery to match.
I’ll share the story of this journey, and why F# continues to challenge the status quo with the simplicity and combining power of its design elements. I’ll discuss the philosophy underlying the F# language design and how we can look at a variety of seemingly unsolvable technical conflicts in different ways, with the aim making progress and improving society as a whole. Of interest to anyone who cares about programming, open and welcoming to all, come along and join in the fun.
27. 350,000
lines of C# OO
by offshore team
30,000
lines of robust F#, with
parallel +more features
An application to evaluate the revenue due from Balancing Services contracts in
the UK energy industry
http://simontcousins.azurewebsites.net/does-the-language-you-use-make-a-
difference-revisited/
28.
29.
30. Zero
bugs in deployed system
“F# is the safe choice for this project,
any other choice is too risky”
An application to evaluate the revenue due from Balancing Services contracts in the
UK energy industry
http://simontcousins.azurewebsites.net/does-the-language-you-use-make-a-
difference-revisited/
35. F# is open, cross-
platform, neutral,
independent
All F# language and
tooling is accepting
contributions
The F# community is
very “self-empowered”
fsharp.org
Visual Studio for
Windows, Mac
Visual Studio Code for
Everywhere
.NET Interactive
Notebooks for
Everywhere
The F# Compiler
Service at the core
Fable for F#-to-
Javascript
SAFE for F# fullstack
F# 5.0 now complete!
43. type Vector2D (dx:double, dy:double) =
let d2 = dx*dx+dy*dy
member v.DX = dx
member v.DY = dy
member v.Length = sqrt d2
member v.Scale(k) = Vector2D (dx*k, dy*k)
Inputs to object
construction
Exported properties
Exported method
Object internals
44. Object Interface Types
type IObject =
interface ISimpleObject
abstract Prop1 : type
abstract Meth2 : type -> type
Object Expressions
{ new IObject with
member x.Prop1 = expr
member x.Meth1 args = expr }
{ new Object() with
member x.Prop1 = expr
interface IObject with
member x.Meth1 args = expr
interface IWidget with
member x.Meth1 args = expr }
Constructed Class Types
type ObjectType(args) =
let internalValue = expr
let internalFunction args = expr
let mutable internalState = expr
member x.Prop1 = expr
member x.Meth2 args = expr
45.
46. objects as a single paradigm
overuse of hierarchical classification
large abstractions many holes failure points
declarations expressions
complex inheriting complex