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
Coverage
Driver
Factor
Company
Car Factor
Coverage
Coverage
Multi-policy
Factor
Vehicle
Driver
Zipcode
Factor
Vehicle
Driver
Driver
Driver
Why can’t it be faster?
4
3/12/2009
Process
List of
Policies
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Vehicle
Basic Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Multi-policy
Factor
Zipcode
Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
14
3/12/2009
let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)
(Lazy<decimal>)
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
15
3/12/2009
let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Process
rq.CreditScore <- scoreCalc()
Spawned Thread
QueryRate rq
List of
Policies
Parallel
Policy
Policy
Coverage
Coverage
Parallel
Coverage
Vehicle
Policy
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Process
rq.CreditScore <- scoreCalc()
Spawned Thread
QueryRate rq
List of
Policies
Parallel
Policy
Policy
Coverage
Coverage
Parallel
Coverage
Vehicle
Policy
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Process
rq.CreditScore <- scoreCalc()
Spawned Thread
QueryRate rq
List of
Policies
Parallel
Policy
Policy
Coverage
Coverage
Parallel
Coverage
Vehicle
Policy
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Process
rq.CreditScore <- scoreCalc()
Spawned Thread
QueryRate rq
List of
Policies
Parallel
Policy
Policy
Coverage
Coverage
Parallel
Coverage
Vehicle
Policy
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Process
rq.CreditScore <- scoreCalc()
Spawned Thread
QueryRate rq
List of
Policies
Parallel
Policy
Policy
Coverage
Coverage
Parallel
Coverage
Vehicle
Policy
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
let force (x:Lazy<x>) = x.Force()
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Policies
Process
decimal list
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
let DriverFactor d =
lazy(
[BaseRate d;
DriverClassFactor d;
InsuranceScoreFactor d;
GoodStudentFactor d;
GrangeLifeFactor d;
AwayAtSchoolFactor d]
|> Seq.map force
|> Seq.reduce (*)
)
List of
Policies
Process
decimal
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
25
3/12/2009
let BasicPolicyFactor() =
lazy(
Seq.map force [AverageDriverFactor();
MultiPolicyCombinationDiscount();
CompanyCarDiscount();]
|> Seq.reduce (*)
)
(unit -> Lazy<decimal>)
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
Factor
let CalcCoverages (policy:Policy) rates coverages = function
| [] -> ()
| c::tail -> updatePolicy(policy, (Async.Run(GetRates policy rates c)))
List of
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Driver
Driver
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
Policies
Process
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Multipolicy
Factor
Zipcode
Factor
Vehicle
Basic
Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Process
Company
Car Factor
Driver
Driver
Factor
List of
Policies
Spawned Thread
Policy
Policy
Parallel
Coverage
Coverage
Parallel
Policy
Coverage
Vehicle
Coverage
Coverage
Vehicle
Basic Policy
Factor
Avg Driver
Factor
(d1 + d2) / 2
Driver
Driver
Factor
Company
Car Factor
Multi-policy
Factor
Zipcode
Factor
Driver
Driver
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
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )