2. Hello!
• About me:
– Chief Scientist at VoloMetrix
http://www.volometrix.com
We’re hiring
– Previously at Decide, Bing, Farecast
– Started using F# a little over a year ago, am an
enthusiast/addict but not an expert
3. 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/
4. 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
5. 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 don’t typically use this, so I’m 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/
6. Functional Programming
• Is fun!
• No single definition, but some combo of
– Immutable variables
– No side-effects
– First-class functions
– Lazy evaluation
7. 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
8. Type Inference
• F# is strictly typed, but usually you don’t 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
9. 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)
10. Combinators
• |> pipes values into functions
Take the array [1,2,3] Send it through an “even filter” Send that to a length function
12. Let’s 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
13. Contrived Example – Discriminated Unions
• Imagine we had no bool type
• Could define one in C# using an enum:
Definition is simple
enough
You’d hope we’d
never get here
This can’t end well
14. Contrived Example – Discriminated Unions
• In F# would do the following:
• Punchline: F# version is cleaner and safer
15. 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”
17. Types for Business Logic
Given a meeting, how many Invitees accepted?
How many Invitees were anonymous?
val NumAccepts : m:Meeting -> int
18. 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
19. 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!
20. Discriminated Unions for Business Logic
• Punchline:
– Types make business logic simple to implement
– First-class functions make abstraction and
refactoring quick and easy
21. Contrived Example – ValueOrDefault
• Want to get a value out of a dictionary, or a
default if the key’s not there
23. Contrived Example - ValueOrDefault
• Same code in F#
Don’t 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)
24. Fun Example – JSON Type Provider
• Want to get tweets in a lightweight way
• Sounds like a job for Python!
15
F# ( Bot) F# is a simple, succinct, efficient functional programming language for
.NET...
Igor Brejc RT @dsyme: If you're into open/cross-platform .NET, F# or C# but mainly use
windows, please read this testing/dev technique http://t.co/poTiUcSsXe
F# ( Bot) F# lets users concentrate on the problems they are solving rather than
getting lost in programming details.
Onorio Catenacci RT @cdrnet: Blog: Test your #csharp/#fsharp code on mono 3.0.10/debian
using #vagrant without leaving Windows: http://t.co/CtGnVn06Cd
…
26. 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
27. Useful Example – SQL Type Provider
This was the most generic database schema I could think of!
28. 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
29. 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!
30. 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, modify my code to find
them!
• There are some good books out there: Expert F# and
F# Programming are two that I like
• Ask me, I know a few things
Hinweis der Redaktion
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