You are on page 1of 29

3/12/2009

What is F#?
Microsoft Multi-paradigm Language
CLR – All the .NET platform benefits
First class language in to Visual Studio 2010

What about F# makes it functional or concurrent?


Immutable Constructs
Higher Order Functions
Partial Application
Ability to do lazy evaluation
Asynchronous Workflows

1
3/12/2009

Real World Application!


Auto Insurance Rating Engine

2
3/12/2009

3
3/12/2009

List of
Policies

Policy Policy Policy

Calculation Calculation Calculation

Driver Company Multi-policy Zipcode


Factor Car Factor Factor Factor

Coverage Coverage Coverage

Vehicle Vehicle

Driver Driver Driver Driver

Why can’t it be faster?

4
3/12/2009

Process List of
Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic Policy
Factor

Avg Driver Company Multi-policy Zipcode


Factor Car Factor Factor Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let rec Rate (policies: System.Collections.Generic.List<Policy>) =


let policies = List.of_seq policies
let rec exec = function
|[] -> ()
|p::tail -> async{
calcCoverages(p, GetCurrentRates(p), GetCoverages(p))
} |> Async.Spawn
exec tail
exec policies

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

5
3/12/2009

let Rate (policies: System.Collections.Generic.List<Policy>) =


let policies = List.of_seq policies
let rec exec = function
|[] -> ()
|p::tail -> async{
calcCoverages(p, GetCurrentRates(p), GetCoverages(p))
} |> Async.Spawn
exec tail
exec policies

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let rec Rate (policies: System.Collections.Generic.List<Policy>) =


let policies = List.of_seq policies
let rec exec = function
|[] -> ()
|p::tail -> async{
calcCoverages(p, GetCurrentRates(p), GetCoverages(p))
} |> Async.Spawn
exec tail
exec policies

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

6
3/12/2009

let rec Rate (policies: System.Collections.Generic.List<Policy>) =


let policies = List.of_seq policies
let rec exec = function
|[] -> ()
|p::tail -> async{
calcCoverages(p, GetCurrentRates(p), GetCoverages(p))
} |> Async.Spawn
exec tail
exec policies

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let rec Rate (policies: System.Collections.Generic.List<Policy>) =


let policies = List.of_seq policies
let rec exec = function
|[] -> ()
|p::tail -> async{
calcCoverages(p, GetCurrentRates(p), GetCoverages(p))
} |> Async.Spawn
exec tail
exec policies

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

7
3/12/2009

let rec calcCoverages (policy:Policy) rates coverages = function


| [] -> ()
| c::tail -> updatePolicy(policy (Async.Run(GetRates policy rates c)))
calcCoverages policy rates tail

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let rec calcCoverages (policy:Policy) rates coverages = function


| [] -> ()
| c::tail -> updatePolicy(policy (Async.Run(GetRates policy rates c)))
calcCoverages policy rates tail

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

8
3/12/2009

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

9
3/12/2009

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

10
3/12/2009

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

11
3/12/2009

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

12
3/12/2009

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

13
3/12/2009

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

14
3/12/2009

let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)

(Lazy<decimal>)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

15
3/12/2009

let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let AverageDriverFactor() =
lazy(
let mutable accum = (decimal)0
for d in p.Drivers do
accum <- accum + (DriverFactor d).Force()
accum / (decimal)p.Drivers.Count)

(unit -> Lazy<decimal>)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

16
3/12/2009

let AverageDriverFactor() =
lazy(
let mutable accum = (decimal)0
for d in p.Drivers do
accum <- accum + (DriverFactor d).Force()
accum / (decimal)p.Drivers.Count)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let AverageDriverFactor() =
lazy(
let mutable accum = (decimal)0
for d in p.Drivers do
accum <- accum + (DriverFactor d).Force()
accum / (decimal)p.Drivers.Count)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

17
3/12/2009

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

18
3/12/2009

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let InsuranceScoreFactor (d:Driver) =


let rq = new RateQuery(RateTableType.CreditScoreFactor)
rq.Age <- Common.CalculateDriverAge(d.BirthDate, p)
let rec scoreCalc() =
match d.InsuranceScoreAttribute.ToString() with
| "CBRN" when score < 2 -> -2
| "CBRS" when score < 2 -> -3
| "CBRW" when score < 2 -> -4
| "CBRV" when score < 2 -> -5
| "CBRX" when score < 2 -> -6
| _ -> d.InsuranceScore
rq.CreditScore <- scoreCalc()
List of
Process Policies

Spawned Thread Policy Policy Policy

QueryRate rq
Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

19
3/12/2009

let InsuranceScoreFactor (d:Driver) =


let rq = new RateQuery(RateTableType.CreditScoreFactor)
rq.Age <- Common.CalculateDriverAge(d.BirthDate, p)
let rec scoreCalc() =
match d.InsuranceScoreAttribute.ToString() with
| "CBRN" when score < 2 -> -2
| "CBRS" when score < 2 -> -3
| "CBRW" when score < 2 -> -4
| "CBRV" when score < 2 -> -5
| "CBRX" when score < 2 -> -6
| _ -> d.InsuranceScore
rq.CreditScore <- scoreCalc()
List of
Process Policies

Spawned Thread Policy Policy Policy

QueryRate rq
Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let InsuranceScoreFactor (d:Driver) =


let rq = new RateQuery(RateTableType.CreditScoreFactor)
rq.Age <- Common.CalculateDriverAge(d.BirthDate, p)
let rec scoreCalc() =
match d.InsuranceScoreAttribute.ToString() with
| "CBRN" when score < 2 -> -2
| "CBRS" when score < 2 -> -3
| "CBRW" when score < 2 -> -4
| "CBRV" when score < 2 -> -5
| "CBRX" when score < 2 -> -6
| _ -> d.InsuranceScore
rq.CreditScore <- scoreCalc()
List of
Process Policies

Spawned Thread Policy Policy Policy

QueryRate rq
Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

20
3/12/2009

let InsuranceScoreFactor (d:Driver) =


let rq = new RateQuery(RateTableType.CreditScoreFactor)
rq.Age <- Common.CalculateDriverAge(d.BirthDate, p)
let rec scoreCalc() =
match d.InsuranceScoreAttribute.ToString() with
| "CBRN" when score < 2 -> -2
| "CBRS" when score < 2 -> -3
| "CBRW" when score < 2 -> -4
| "CBRV" when score < 2 -> -5
| "CBRX" when score < 2 -> -6
| _ -> d.InsuranceScore
rq.CreditScore <- scoreCalc()
List of
Process Policies

Spawned Thread Policy Policy Policy

QueryRate rq
Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let InsuranceScoreFactor (d:Driver) =


let rq = new RateQuery(RateTableType.CreditScoreFactor)
rq.Age <- Common.CalculateDriverAge(d.BirthDate, p)
let rec scoreCalc() =
match d.InsuranceScoreAttribute.ToString() with
| "CBRN" when score < 2 -> -2
| "CBRS" when score < 2 -> -3
| "CBRW" when score < 2 -> -4
| "CBRV" when score < 2 -> -5
| "CBRX" when score < 2 -> -6
| _ -> d.InsuranceScore
rq.CreditScore <- scoreCalc()
List of
Process Policies

Spawned Thread Policy Policy Policy

QueryRate rq
Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

21
3/12/2009

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

22
3/12/2009

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

let force (x:Lazy<x>) = x.Force()


Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

decimal list Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

23
3/12/2009

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Process Policies

decimal Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

24
3/12/2009

let AverageDriverFactor() =
lazy(
let mutable accum = (decimal)0
for d in p.Drivers do
accum <- accum + (DriverFactor d).Force()
accum / (decimal)p.Drivers.Count
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let AverageDriverFactor() =
lazy(
let mutable accum = (decimal)0
for d in p.Drivers do
accum <- accum + (DriverFactor d).Force()
accum / (decimal)p.Drivers.Count
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

25
3/12/2009

let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)

(unit -> Lazy<decimal>)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let Result (p:Policy)(v:Vehicle)(c:AutoCoverage)(r:CurrentRates) =


lazy(
let QueryRate(rq:RateQuery) =
rq.Coverage <- c.ToInt()
r.GetRate(rq)
.
.
.
BasicPolicyFactor()
)

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

26
3/12/2009

let GetRates (policy:Policy) rates coverage =


async{
let! results = Async.Parallel[
for v in Policy.vehicles ->
async{return (Result policy v coverage rates).Force()}
]
return (coverage, Seq.reduce(+) results)}

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

let CalcCoverages (policy:Policy) rates coverages = function


| [] -> ()
| c::tail -> updatePolicy(policy, (Async.Run(GetRates policy rates c)))

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

27
3/12/2009

let rec Rate (policies: System.Collections.Generic.List<Policy>) =


let policies = List.of_seq policies
let rec exec = function
|[] -> ()
|p::tail -> async{
calcCoverages(p, GetCurrentRates(p), GetCoverages(p))
} |> Async.Spawn
exec tail
exec policies

List of
Process Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic
Policy
Factor

Multi-
Avg Driver Company Zipcode
policy
Factor Car Factor Factor
Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

Process List of
Policies

Spawned Thread Policy Policy Policy

Parallel Coverage Coverage Coverage Coverage Coverage

Parallel Vehicle Vehicle

Basic Policy
Factor

Avg Driver Company Multi-policy Zipcode


Factor Car Factor Factor Factor

(d1 + d2) / 2 Driver Driver

Driver Driver
Factor Factor

28
3/12/2009

1 5 10 20 40 50

C# 3 10 15 38 78 95

F# 1 4 7 15 20 35

#light
let RealWorld F# = Concurrent applications

Amanda Laucher
Amanda.Laucher@SophicGroup.net

pandamonial.com
Twitter: pandamonial

29

You might also like