a taste of f #: today and future
DESCRIPTION
UCL Algo Trading. A Taste of F #: Today and Future. Don Syme Principal Researcher/Architect Microsoft. What is F # and why is it interesting?. F# is…. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/1.jpg)
A Taste of F#: Today and Future
Don SymePrincipal Researcher/ArchitectMicrosoft
UCL Algo Trading
![Page 2: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/2.jpg)
What is F# and why is it interesting?
![Page 3: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/3.jpg)
F# is…...a productive, supported, interoperable,
functional-first programming language that
allows you to write simple code to solve complex
problems.
![Page 4: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/4.jpg)
Crossing boundaries
Programming Expressivity for Mathematical tasks
“Fresh Code” PerformanceProfessional Development
F#C++
Math-ematica…
C#Java
Python…
Programming
QF modelling
Financial engineeringAlgorithmic Trading
![Page 5: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/5.jpg)
Why is F# appealing in finance?
Functional programming fits with much financial work“Programmatic modelling” A typed, efficient scripting language gets you a long way
Plays differently for different roles:Enable quants to contribute to component developmentEnables architects to explore hard problems fluentlyEnables developers to tackle parallel and async programming
![Page 6: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/6.jpg)
Simple Code, Strongly Typed
![Page 7: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/7.jpg)
type Command = Command of (Rover -> unit)
let BreakCommand = Command(fun rover -> rover.Accelerate(-1.0))
let TurnLeftCommand = Command(fun rover -> rover.Rotate(-5.0<degs>))
abstract class Command { public virtual void Execute(); } abstract class RoverCommand : Command { protected Rover Rover { get; private set; } public RoverCommand(MarsRover rover) { this.Rover = rover; } } class BreakCommand : RoverCommand { public BreakCommand(Rover rover) : base(rover) { } public override void Execute() { Rover.Rotate(-5.0); } } class TurnLeftCommand : RoverCommand { public TurnLeftCommand(Rover rover) : base(rover) { } public override void Execute() { Rover.Rotate(-5.0); } }
Simplicity: Functions as Values
F#
OO
![Page 8: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/8.jpg)
let swap (x, y) = (y, x)
let rotations (x, y, z) = [ (x, y, z); (z, x, y); (y, z, x) ]
let reduce f (x, y, z) = f x + f y + f z
Tuple<U,T> Swap<T,U>(Tuple<T,U> t){ return new Tuple<U,T>(t.Item2, t.Item1)}
ReadOnlyCollection<Tuple<T,T,T>> Rotations<T>(Tuple<T,T,T> t) { new ReadOnlyCollection<int> (new Tuple<T,T,T>[] { new Tuple<T,T,T>(t.Item1,t.Item2,t.Item3); new Tuple<T,T,T>(t.Item3,t.Item1,t.Item2); new Tuple<T,T,T>(t.Item2,t.Item3,t.Item1); });}
int Reduce<T>(Func<T,int> f,Tuple<T,T,T> t) { return f(t.Item1) + f(t.Item2) + f (t.Item3); }
F#
Simplicity: Functional DataC#
![Page 9: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/9.jpg)
The Big Trends
THE CLOUD MULTICORE
![Page 10: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/10.jpg)
Async.Parallel [ httpAsync "www.google.com"; httpAsync "www.bing.com"; httpAsync "www.yahoo.com"; ]
|> Async.RunSynchronously
Parallel I/O
![Page 11: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/11.jpg)
Async.Parallel [ for i in 0 .. 200 -> computeTask i ]
|> Async.RunSynchronously
Parallel CPU
![Page 12: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/12.jpg)
F# 2.0 ships with Visual Studio 2010
![Page 13: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/13.jpg)
Demo
![Page 14: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/14.jpg)
F# can be used for everything,but excels at analytical engines
![Page 15: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/15.jpg)
Benchmark Performance by Language
F# C# C++ IronPython
Pro
ce
ss
ing
Rate
spectral
mandlebrot
nbody
fannkuch
nseive.bits
nsieve
MS Confidential
![Page 16: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/16.jpg)
Example #1 (Power Company)
I have written an application to balance the national power generation schedule … for an energy company.
...the calculation engine was written in F#.
The use of F# to address the complexity at the heart of this application clearly demonstrates a sweet spot for the language … algorithmic analysis of large data sets.
Simon Cousins (Eon Powergen)
![Page 17: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/17.jpg)
Examples #2/#3: Finance companies
![Page 18: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/18.jpg)
Example #4: Biotech
...F# rocks - building algorithms for DNA processing and it's like a drug. 12-15 at Amyris use F#...
F# has been phenomenally useful. I would be writing a lot of this in Python otherwise and F# is more robust, 20x - 100x faster to run and faster to develop.
Darren Platt, Amyris BioTechnologies
![Page 19: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/19.jpg)
Case Study #5: Microsoft “adPredict”
![Page 20: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/20.jpg)
Case Study #5: Microsoft “adPredict”
4 week project, 4 machine learning experts
100million probabilistic variables
Processes 6TB of training data
Real time processing (N,000 impression updates / sec)
“F# was absolutely integral to our success”
“We delivered a robust, high-performance solution on-time.”
“We couldn’t have achieved this with any other tool given the constraints of the task”
“F# programming is fun – I feel like I learn more about programming every day”
![Page 21: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/21.jpg)
Asynchronous & Parallel & Reactive
async { let! res = <async-event> ... }
React to a GUI EventReact to a Timer Callback
React to a Query ResponseReact to a HTTP Response
React to a Web Service ResponseReact to a Disk I/O Completion
Agent reacts to Message
![Page 22: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/22.jpg)
F# async + immutable
Parallel
Server
Agents
![Page 23: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/23.jpg)
Units of Measurelet EarthMass = 5.9736e24<kg>
// Average between pole and equator radiilet EarthRadius = 6371.0e3<m>
// Gravitational acceleration on surface of Earth let g = PhysicalConstants.G * EarthMass / (EarthRadius * EarthRadius)
![Page 24: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/24.jpg)
Units of Measure – Typical Example[<Measure>] type money
[<Measure>] type shares [<Measure>] type volume
type Price = { Open: float<money>; High: float<money>; Low: float<money>; Close: float<money>; Volume: float<volume> }
![Page 25: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/25.jpg)
F# Futures: Language Integrated Data
demo
![Page 27: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/27.jpg)
Type Providers: The Vision
…web data…data markets…systems data…spreadsheets…web services…CRM data…social data…SQL data…XML data...
without explicit codegen
strongly typed
extensible, open
![Page 28: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/28.jpg)
In Summary
Simple, expressive, productive addition to .NET
Ready for supported use in VS2010
F# greatly simplifies parallelism
An amazing data-rich future ahead
F#
![Page 29: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/29.jpg)
http://meetup.com/FSharpLondon
Jul 4, 6:30pmSkillsMatter
A great place to meet F# users, trainers, architects,
consultants, …
![Page 31: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/31.jpg)
Summary
The world is information rich
Our languages need to be information-rich too
The Type Provider Manifesto? Consume anything! Directly!
Strongly typed! No walls!
![Page 32: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/32.jpg)
Which talk?
F# Today?
F# Advanced?
F# Tomorrow?
![Page 33: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/33.jpg)
Which talk?
F# Today!
F# Advanced?
F# Tomorrow!
![Page 34: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/34.jpg)
Which talk?
F# Today!
![Page 35: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/35.jpg)
Some Basics
topic
![Page 36: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/36.jpg)
Language Integrated Web Data
demo
![Page 37: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/37.jpg)
// Freebase.fsx // Example of reading from freebase.com in F# // by Jomo Fisher #r "System.Runtime.Serialization" #r "System.ServiceModel.Web" #r "System.Web" #r "System.Xml" open System open System.IO open System.Net open System.Text open System.Web open System.Security.Authentication open System.Runtime.Serialization [<DataContract>] type Result<'TResult> = { [<field: DataMember(Name="code") >] Code:string [<field: DataMember(Name="result") >] Result:'TResult [<field: DataMember(Name="message") >] Message:string } [<DataContract>] type ChemicalElement = { [<field: DataMember(Name="name") >] Name:string [<field: DataMember(Name="boiling_point") >] BoilingPoint:string [<field: DataMember(Name="atomic_mass") >] AtomicMass:string }
let Query<'T>(query:string) : 'T = let query = query.Replace("'","\"") let queryUrl = sprintf "http://api.freebase.com/api/service/mqlread?query=%s" "{\"query\":"+query+"}" let request : HttpWebRequest = downcast WebRequest.Create(queryUrl) request.Method <- "GET" request.ContentType <- "application/x-www-form-urlencoded" let response = request.GetResponse() let result = try use reader = new StreamReader(response.GetResponseStream()) reader.ReadToEnd(); finally response.Close() let data = Encoding.Unicode.GetBytes(result); let stream = new MemoryStream() stream.Write(data, 0, data.Length); stream.Position <- 0L let ser = Json.DataContractJsonSerializer(typeof<Result<'T>>) let result = ser.ReadObject(stream) :?> Result<'T> if result.Code<>"/api/status/ok" then raise (InvalidOperationException(result.Message)) else result.Result let elements = Query<ChemicalElement array>("[{'type':'/chemistry/chemical_element','name':null,'boiling_point':null,'atomic_mass':null}]") elements |> Array.iter(fun element->printfn "%A" element)
How would we do this today?
![Page 38: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/38.jpg)
The Magic: Type Providers
F#
Web Data
Cloud Data
Enterprise
Data
Local Data
Web Services
Your Data
![Page 39: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/39.jpg)
A Type Provider is….
A design-time component that provides a computed space of types and methods…
A compiler/IDE extension…
An adaptor between data/services and .NET languages…
![Page 40: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/40.jpg)
Note: F# still contains no data
Open architecture
You can write your own type provider
![Page 41: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/41.jpg)
OData
type Netflix = ODataService<"http://odata.netflix.com">
Fluent, Typed Access To OData
![Page 42: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/42.jpg)
SQL Server/Entity Framework
type SQL = SqlEntityConnection<"Server='.\\SQLEXPRESS'..">
Fluent, Typed Access To SQL
![Page 43: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/43.jpg)
SharePoint
type EmeaSite = SharePointSite<"http://myemea/">
Fluent, Typed Access To
SharePoint Lists
![Page 44: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/44.jpg)
F# Futures: Queries
let avatarTitles = query { for t in netflix.Titles do where (t.Name.Contains "Avatar") }
Declarative LINQ queries
![Page 45: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/45.jpg)
Fundamentals - Whitespace Matters
let computeDerivative f x = let p1 = f (x - 0.05)
let p2 = f (x + 0.05)
(p2 – p1) / 0.1
Offside (bad indentation)
![Page 46: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/46.jpg)
Fundamentals - Whitespace Matters
let computeDerivative f x = let p1 = f (x - 0.05)
let p2 = f (x + 0.05)
(p2 – p1) / 0.1
![Page 47: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/47.jpg)
Your First F# Application
printfn "Hello World"
C:\test> fsc test.fs
C:\test> test.exeHello WorldC:\test>
![Page 48: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/48.jpg)
Your Second F# Application
open System.Windows.Form
let form = new Form (Visible=true)
form.Click.Add (fun _ -> printfn "click")
Application.Run form
![Page 49: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/49.jpg)
Functional– Pipelines
x |> f
The pipeline operator
![Page 50: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/50.jpg)
Functional– Pipelines
x |> f1 |> f2 |> f3
Successive stages in a pipeline
![Page 51: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/51.jpg)
F# - Objects + Functional
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
![Page 52: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/52.jpg)
F# Futures: Queries
let avatarTitles = query { for t in netflix.Titles do where (t.Name.Contains "Avatar") sortBy t.Name take 100 } Declarative
LINQ queries
![Page 53: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/53.jpg)
AdPredict: What We Observed
Quick Coding
Agile Coding
Scripting
Performance
Memory-Faithful
Succinct
Symbolic
.NET Integration
F#’s powerful type inference means less typing, more
thinking
Type-inferred code is easily refactored
“Hands-on” exploration.
Immediate scaling to massive data sets
mega-data structures, 16GB machines
Live in the domain, not the language
Schema compilation and “Schedules”
Especially Excel, SQL Server
![Page 54: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/54.jpg)
Await!
Await!
Await!
F# example: Serving 50,000+ simultaneous TCP connections with ~10 threads
![Page 55: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/55.jpg)
Case Study #5: Microsoft adCenter “adPredict”
Weeks of data in training: N,000,000,000 impressions, 6TB data
2 weeks of CPU time during training: 2 wks × 7 days × 86,400 sec/day =
1,209,600 secondsLearning algorithm speed requirement:
N,000 impression updates / secN00.0 μs per impression update
![Page 56: A Taste of F #: Today and Future](https://reader033.vdocuments.site/reader033/viewer/2022051620/568133d2550346895d9ac94f/html5/thumbnails/56.jpg)
Example #4: Biotech
...F# rocks - building algorithms for DNA processing and it's like a drug. 12-15 at Amyris use F#...
F# has been phenomenally useful. I would be writing a lot of this in Python otherwise and F# is more robust, 20x - 100x faster to run and faster to develop.
Darren Platt, Amyris BioTechnologies