際際滷

際際滷Share a Scribd company logo
F# for Startups
Joel Grus
@joelgrus
Chief Scientist,
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
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
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/
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#
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/
Functional Programming
 Is fun!
 No single definition, but some combo of
 First-class functions
 Immutable variables
 No side-effects
 Lazy evaluation
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
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
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)
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
Tuples
 Easy way of creating compound types
 Available (but wordier + less common) in C#
 var pair = new Tuple<int,string>(1,1)
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
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
Contrived Example  Discriminated Unions
 In F# would do the following:
 Punchline: F# version is cleaner and safer
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
Types for Business Logic
Types for Business Logic
Given a meeting, how many Invitees accepted?
How many Invitees were anonymous?
val NumAccepts : m:Meeting -> int
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
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!
Discriminated Unions for Business Logic
 Punchline:
 Types make business logic simple to implement
 First-class functions make abstraction and
refactoring quick and easy
Contrived Example  ValueOrDefault
 Want to get a value out of a dictionary, or a
default if the keys not there
Contrived Example - ValueOrDefault
 What if we want it generic?
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)
Fun Example  JSON Type Provider
 Want to get tweets in a lightweight way
 Sounds like a job for Python!
Fun Example  JSON Type Provider
Or for F#!
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
Useful Example  SQL Type Provider
This was the most generic database schema I could think of!
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
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!
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

More Related Content

F# for startups v2

  • 1. F# for Startups Joel Grus @joelgrus Chief Scientist,
  • 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
  • 23. Contrived Example - ValueOrDefault What if we want it generic?
  • 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!
  • 26. Fun Example JSON Type Provider Or for F#!
  • 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

  1. currying
  2. Sequence expressions
  3. Anonymous Functions, Pattern Matching, Type Inference
  4. Static v dynamic typing
  5. Explain what the type provider does
  6. Explain what the type provider does
  7. More about sequence expressions, group by, IQueryable