F#
Designmuster-Implementierung in F #
Suche…
Datengesteuerte Programmierung in F #
Dank Typinferenz und partieller Anwendung in F#
die datengesteuerte Programmierung kurz und lesbar.
Stellen wir uns vor, wir verkaufen Autoversicherungen. Bevor wir versuchen, es an einen Kunden zu verkaufen, versuchen wir zu ermitteln, ob der Kunde ein gültiger potenzieller Kunde für unser Unternehmen ist, indem er das Geschlecht und das Alter des Kunden überprüft.
Ein einfaches Kundenmodell:
type Sex =
| Male
| Female
type Customer =
{
Name : string
Born : System.DateTime
Sex : Sex
}
Als Nächstes möchten wir eine Ausschlussliste (Tabelle) definieren, damit ein Kunde keine Kfz-Versicherung abschließen kann, wenn er mit einer Zeile in der Ausschlussliste übereinstimmt.
// If any row in this list matches the Customer, the customer isn't eligible for the car insurance.
let exclusionList =
let __ _ = true
let olderThan x y = x < y
let youngerThan x y = x > y
[|
// Description Age Sex
"Not allowed for senior citizens" , olderThan 65 , __
"Not allowed for children" , youngerThan 16 , __
"Not allowed for young males" , youngerThan 25 , (=) Male
|]
Aufgrund der Typinferenz und der teilweisen Anwendung ist die Ausschlussliste flexibel und leicht verständlich.
Schließlich definieren wir eine Funktion, die die Ausschlussliste (eine Tabelle) verwendet, um die Kunden in zwei Bereiche aufzuteilen: potenzielle und verweigerte Kunden.
// Splits customers into two buckets: potential customers and denied customers.
// The denied customer bucket also includes the reason for denying them the car insurance
let splitCustomers (today : System.DateTime) (cs : Customer []) : Customer []*(string*Customer) [] =
let potential = ResizeArray<_> 16 // ResizeArray is an alias for System.Collections.Generic.List
let denied = ResizeArray<_> 16
for c in cs do
let age = today.Year - c.Born.Year
let sex = c.Sex
match exclusionList |> Array.tryFind (fun (_, testAge, testSex) -> testAge age && testSex sex) with
| Some (description, _, _) -> denied.Add (description, c)
| None -> potential.Add c
potential.ToArray (), denied.ToArray ()
Zum Abschluss definieren wir einige Kunden und sehen, ob sie potenzielle Kunden für unsere Kfz-Versicherung sind:
let customers =
let c n s y m d: Customer = { Name = n; Born = System.DateTime (y, m, d); Sex = s }
[|
// Name Sex Born
c "Clint Eastwood Jr." Male 1930 05 31
c "Bill Gates" Male 1955 10 28
c "Melina Gates" Female 1964 08 15
c "Justin Drew Bieber" Male 1994 03 01
c "Sophie Turner" Female 1996 02 21
c "Isaac Hempstead Wright" Male 1999 04 09
|]
[<EntryPoint>]
let main argv =
let potential, denied = splitCustomers (System.DateTime (2014, 06, 01)) customers
printfn "Potential Customers (%d)\n%A" potential.Length potential
printfn "Denied Customers (%d)\n%A" denied.Length denied
0
Dies druckt:
Potential Customers (3)
[|{Name = "Bill Gates";
Born = 1955-10-28 00:00:00;
Sex = Male;}; {Name = "Melina Gates";
Born = 1964-08-15 00:00:00;
Sex = Female;}; {Name = "Sophie Turner";
Born = 1996-02-21 00:00:00;
Sex = Female;}|]
Denied Customers (3)
[|("Not allowed for senior citizens", {Name = "Clint Eastwood Jr.";
Born = 1930-05-31 00:00:00;
Sex = Male;});
("Not allowed for young males", {Name = "Justin Drew Bieber";
Born = 1994-03-01 00:00:00;
Sex = Male;});
("Not allowed for children", {Name = "Isaac Hempstead Wright";
Born = 1999-04-09 00:00:00;
Sex = Male;})|]