2. Hello!
About me:
Chief Scientist at VoloMetrix
Previously at Decide, Bing, Farecast
Started using F# a little over a year ago, am an
enthusiast/addict but not an expert
Also write a lot of Python, a fair amount of
JavaScript, and a tiny amount of Clojure
3. VoloMetrix
Social Enterprise Intelligence
Analyze email and calendar data to learn
Whos connected to whom, and
Where is peoples time going
In order to help them do their jobs better!
http://www.volometrix.com
Were hiring
4. What is F#?
F# is a succinct, expressive, and
efficient functional and object-
oriented language for Microsoft .NET
that helps you write simple code to
solve complex problems.
http://research.microsoft.com/en-us/projects/fsharp/
5. My F# Journey
Once upon a time the VoloMetrix application
back-end was written entirely in C#
One day I used Ruby (ick!) to prototype very
functional (and slow) analytics platform
Feel was very F#-y, so started learning and
porting
Can develop in F# a lot faster than in C#
Can develop in F# a lot happier than in C#
Today application is a mix of F# and C# projects
Analytics mostly written in F#
Plumbing mostly written in C#
6. Some nice things about F#
Conciseness
Whitespace formatting
Type inference
Convenience
First-class functions
Interactive shell
Correctness
No NULLs (in the normal course of things)
Immutable values
Concurrency
I dont typically use this, so Im not going to talk about it!
Completeness
Access to .NET libraries + Visual Studio
Can mutate/iterate when necessary
I stole this list from http://fsharpforfunandprofit.com/
7. Functional Programming
Is fun!
No single definition, but some combo of
First-class functions
Immutable variables
No side-effects
Lazy evaluation
8. F# Basics
Type inference
Functions
Combinators
Tuples
Goal is not to teach you F# tonight, but to prime your
brains so that my examples sort of make sense
9. Type Inference
F# is strictly typed, but usually you dont have
to tell it the types
It figures them out like magic!
If you need to specify types, they go after
val f : x:int -> int
val g : x:float -> float
val h : x:string -> string
10. Functions
Functions are just objects
Anonymous functions are easy too
val applyTwice : f:('a -> 'a) -> x:'a -> 'a
val square : x:int -> int
val fourthPower : (int -> int)
11. Combinators
|> pipes values into functions
Easy to build elaborate data-processing
pipelines
(Which are difficult to debug)
Take the array [1,2,3] Send it through an even filter Send that to a length function
12. Tuples
Easy way of creating compound types
Available (but wordier + less common) in C#
var pair = new Tuple<int,string>(1,1)
13. Lets Do Some Examples
Punchline will always be some variation of
Hey, look how clean and safe and simple my code is
and how fast I wrote it!
Every one of these things is nice in a start-up
14. Contrived Example Discriminated Unions
Imagine we had no bool type
Could define one in C# using an enum:
Definition is simple
enough
Youd hope wed
never get here
This cant end well
15. Contrived Example Discriminated Unions
In F# would do the following:
Punchline: F# version is cleaner and safer
16. Types for Business Logic
Want to represent meetings
A meeting has
Start Date
End Date
Subject
Invitees
Each invitee is a Person, and a Response
A Person can be have a Name or be Anonymous
A Response can be Accept or Decline
18. Types for Business Logic
Given a meeting, how many Invitees accepted?
How many Invitees were anonymous?
val NumAccepts : m:Meeting -> int
19. Discriminated Unions for Business Logic
Given a meeting, how many Invitees accepted?
How many Invitees were anonymous?
What can we factor out?
val CountInvitees : predicate:(Invitee -> bool) -> m:Meeting -> int
20. Discriminated Unions for Business Logic
Given a meeting, how many Invitees accepted?
How many Invitees were anonymous?
val NumAccepts2 : m:Meeting -> int
val NumAccepts3 : m:Meeting -> int
Use currying!
21. Discriminated Unions for Business Logic
Punchline:
Types make business logic simple to implement
First-class functions make abstraction and
refactoring quick and easy
22. Contrived Example ValueOrDefault
Want to get a value out of a dictionary, or a
default if the keys not there
24. Contrived Example - ValueOrDefault
Same code in F#
Dont have to specify types to
use generic!
val ValueOrDefault : dict:Dictionary<'a,'b> -> key:'a -> defaultValue:'b -> 'b
Punchline: Takes less code than C#, is more
readable (for me)
25. Fun Example JSON Type Provider
Want to get tweets in a lightweight way
Sounds like a job for Python!
27. Fun Example JSON Type Provider
Punchline
Easy to bang out really quick prototypes
Get flexibility of a scripting language like Python
but with type safety
.NET integration means easy to build your
prototypes into full-fledged applications
28. Useful Example SQL Type Provider
This was the most generic database schema I could think of!
29. Useful Example SQL Type Provider
Punchline: Get to work with typed database
objects for free, great for complex analytics
(or external libraries) with no SQL equivalent
30. F# is not Perfect
Life is dull without NullReferenceException
Tooling is not on par with C#
Hard to organize projects, file order matters
Everyone knows C#, no one knows F#
P(zealot | knows F#) is very high!
Your code will be so unexpectedly good that
people will mistake you for some sort of guru
and then invite you to give talks that are way
outside of your comfort zone!
31. Resources
http://www.tryfsharp.org/
http://fsharp.org
http://fsharpforfunandprofit.com/
http://en.wikibooks.org/wiki/F_Sharp_Programming
Lots of F# people on Twitter
There are some good books out there: Expert F# and
F# Programming are two that I like
Ask me, I know a few things
Editor's Notes
currying
Sequence expressions
Anonymous Functions, Pattern Matching, Type Inference
Static v dynamic typing
Explain what the type provider does
Explain what the type provider does
More about sequence expressions, group by, IQueryable