F#: What I've learnt so far

51
F# What I’ve learnt so far Mark Needham

description

A talk I gave to the Sydney Alt.NET group on Tuesday 30th June 2009 about some of the stuff I've learnt playing around with F#.

Transcript of F#: What I've learnt so far

Page 1: F#: What I've learnt so far

F#What I’ve learnt so far

Mark Needham

Page 2: F#: What I've learnt so far

What is F#?

Page 3: F#: What I've learnt so far

Another language that runs on the CLR

Page 4: F#: What I've learnt so far

Interoperable with other .NET languages

Page 5: F#: What I've learnt so far

Functional...

Page 6: F#: What I've learnt so far

...but with Object Oriented features too

Page 7: F#: What I've learnt so far

Statically typed with type inference

Page 8: F#: What I've learnt so far

Why did I want to learn F#?

Page 9: F#: What I've learnt so far

Different mindset

Page 10: F#: What I've learnt so far

Immutability

Page 11: F#: What I've learnt so far

Concurrency

Page 12: F#: What I've learnt so far

How did I go about learning F#?

Page 13: F#: What I've learnt so far
Page 14: F#: What I've learnt so far
Page 15: F#: What I've learnt so far

Functions

Page 16: F#: What I've learnt so far

Can live on their own

Page 17: F#: What I've learnt so far

letaddab=a+b

http://intwoplacesatonce.com/?p=9

Page 18: F#: What I've learnt so far

Type inference

Page 19: F#: What I've learnt so far

letaddab=a+b

valadd:int‐>int‐>int

Page 20: F#: What I've learnt so far

letadd(a:string)(b:string)=a+b

valadd:string‐>string‐>string

Page 21: F#: What I've learnt so far

Lots of ways to do the same thing

Page 22: F#: What I've learnt so far

letwithLinks(statuses:seq<TwitterStatus>)=Seq.filter(funs‐>s.Text.Contains("http"))statuses

Page 23: F#: What I've learnt so far

letwithLinks(statuses:seq<TwitterStatus>)=statuses|>Seq.filter(funs‐>s.Text.Contains("http"))

Page 24: F#: What I've learnt so far

Forwardoperator(|>)

('a‐>('a‐>'b)‐>'b)

Page 25: F#: What I've learnt so far

letwithLinks(statuses:seq<TwitterStatus>)=Seq.filter(funs‐>hasLinks)statuses

letwithLinks(statuses:seq<TwitterStatus>)=statuses|>Seq.filter(funs‐>hasLinks)

letwithLinksstatuses=statuses|>Seq.filter(fun(s:TwitterStatus)‐>hasLinks)

letwithLinks(statuses:seq<TwitterStatus>):seq<TwitterStatus>=statuses|>Seq.filter(funs‐>hasLinks)

letwithLinks:seq<TwitterStatus>‐>seq<TwitterStatus>=Seq.filter(funs‐>hasLinks)

Page 26: F#: What I've learnt so far

Composing functions

Page 27: F#: What I've learnt so far

letstatuses=seq{yieldnewTwitterStatus()}

letsortedStatuses=Seq.sortBy(fun(s:TwitterStatus)‐>s.Id)statuses

letfirstStatus=Seq.hdsortedStatuses

Page 28: F#: What I've learnt so far

seq{yieldnewTwitterStatus()}|>Seq.sortBy(fun(s:TwitterStatus)‐>s.Id)|>Seq.hd

Page 29: F#: What I've learnt so far

Functions are cool but lack structure

Page 30: F#: What I've learnt so far

Refactoring to objects

Page 31: F#: What I've learnt so far

typeTweets={ TwitterStatuses:seq<TwitterStatus> }

Page 32: F#: What I've learnt so far

letmyTweets={ TwitterStatuses=TwitterService.GetStatuses100 }

Page 33: F#: What I've learnt so far

letwithLinks(statuses:seq<TwitterStatus>)=statuses|>Seq.filter(funs‐>s.Text.Contains("http"))letprint(statuses:seq<TwitterStatus>)=forsinstatusesdoprintfn"[%s]%s"s.User.ScreenNamestatus.Text

typeTweetswithmembert.print()=printt.TwitterStatusesmembert.withLinks()=

{TwitterStatuses=withLinkst.TwitterStatuses}

Page 34: F#: What I've learnt so far

Leads to simpler/easier to understand code

Page 35: F#: What I've learnt so far

Helped by unit testing

Page 36: F#: What I've learnt so far

xUnit.NET

Page 37: F#: What I've learnt so far

[<Fact>]letshould_recognise_message_with_link_as_a_link()=letmessageWithLink=(newMessageBuilder(message="http://www.google.com")).Build()

Assert.True(messageWithLink|>hasLink)

Page 38: F#: What I've learnt so far

typeMessageBuilder(?message:string,?user:string)=letbuildMessagemessageuser=

newTwitterStatus(Text=message,User=newTwitterUser(ScreenName=user)

)

membermb.Build()=buildMessage(ifmessage.IsSome

thenmessage.Valueelse"")(ifuser.IsSomethenuser.Valueelse"")

Page 39: F#: What I've learnt so far

[<Fact>]letshould_not_show_any_tweets_by_me()=

letmessageByMe=(newMessageBuilder(message="",

user="markhneedham")).Build()lettweets=seq{yieldmessageByMe;yieldmessageByMe;yieldmessageByMe}

lettweetsExcludingMe=tweets|>excludeSelfAssert.Equal(0,tweetsExcludingMe|>Seq.length)

Page 40: F#: What I've learnt so far

Still doing all the processing at the end

Page 41: F#: What I've learnt so far

Asynchronous Workflows

Page 42: F#: What I've learnt so far

“Perform a computation in a background thread without

blocking execution on current thread”

Page 43: F#: What I've learnt so far

Main TweetProcessor

Tweets with links

Processor

Has link?

Twitter Couch DB

Write to

Page 44: F#: What I've learnt so far

What am I learning next?

Page 45: F#: What I've learnt so far

Programming in a more functional way

Page 46: F#: What I've learnt so far

Loops -> List functions/recursiveObjects -> ADTsClasses -> Modules/Signatures/Functors

Page 47: F#: What I've learnt so far

Quotations

Page 48: F#: What I've learnt so far

Where can you learn more?

Page 49: F#: What I've learnt so far

Books

Page 50: F#: What I've learnt so far

On the web

Hub FS (http://cs.hubfs.net)

Robert Pickering’s Wiki(http://www.strangelights.com/FSharp/Wiki/)

Chris Smith’s Blog(http://blogs.msdn.com/chrsmith/)

Matthew Podwysocki’s Blog(http://weblogs.asp.net/Podwysocki/)

Wes Dyer’s Blog(http://blogs.msdn.com/wesdyer/)

Tomas Petricek’s Blog(http://tomasp.net/blog/)

Page 51: F#: What I've learnt so far

Mark [email protected]

Blog: http://www.markhneedham.com/blogTwitter: markhneedham