Der wichtigste Teil des Codes beschäftigt sich mit .NET-API, die nicht funktionsfähig ist, so gibt es keine Möglichkeit, diesen Teil des Codes zu machen vor allem mehr idiomatische oder schöner. Der Schlüssel in der funktionalen Programmierung ist jedoch Abstraktion, so dass Sie diesen (hässlichen) Code in eine idiomatische und wiederverwendbare Funktion verstecken können.
Für Sammlungen von Daten in F # darstellt, entweder Sie Standard-F # Listentyp verwenden können (die für die Funktionsdatenverarbeitung gut ist) oder seq<'a>
(die Standard-NET ist IEnumerable<'a>
unter der Abdeckung), die gut funktioniert, wenn sie mit anderen Arbeits .NET-Bibliotheken
Je nachdem, wie Sie Datenbank an anderer Stelle im Code zugreifen, könnte folgende Arbeiten:
// Runs the specified query 'sql' and formats rows using function 'f'
let query sql f =
// Return a sequence of values formatted using function 'f'
seq { use cn = new OleDbConnection(cnstr) // will be disposed
let da = new OleDbDataAdapter(new OleDbCommand(sql, cn))
let ds = new DataSet()
cn.Open()
let i = da.Fill(ds)
// Iterate over rows and format each row
let rowCol = ds.Tables.[0].Rows
for i in 0 .. (rowCount - 1) do
yield f (rowCol.[i]) }
Jetzt können Sie die query
Funktion benutzen, um Ihre ursprünglichen Code zu schreiben, etwa wie folgt aus:
let names = query "SELECT * FROM People" (fun row -> row.["LastName"])
printfn "count = %d" (Seq.count names)
for name in names do printfn "%A" name
// Using 'Seq.iter' makes the code maybe nicer
// (but that's a personal preference):
names |> Seq.iter (printfn "%A")
Ein weiteres Beispiel könnten Sie schreiben ist:
// Using records to store the data
type Person { LastName : string; FirstName : string }
let ppl = query "SELECT * FROM People" (fun row ->
{ FirstName = row.["FirstName"]; LastName = row.["LastName"]; })
let johns = ppl |> Seq.filter (fun p -> p.FirstName = "John")
BTW: In Bezug auf den Vorschlag von Mau würde ich Funktionen höherer Ordnung nicht übermäßig verwenden, wenn es eine direktere Möglichkeit gibt, den Code mithilfe von Sprachkonstrukten wie for
zu schreiben. Das Beispiel mit iter
oben ist einfach genug und einige Leute finden es besser lesbar, aber es gibt keine allgemeine Regel ...
Nicht sicher, verstehe ich die Frage. – BuddyJoe
Er meinte, dass die Aufgabe (DB-Operationen mit .NET-Bibliotheken) notwendigerweise in imperativem Code endet, deshalb scheint F # nicht dort. Es könnte jedoch sehr gut geeignet sein, um die Daten zu verarbeiten, sobald Sie sie aus der Datenbank erhalten haben. – Mau
@tyndall Mau ist zu 100% korrekt. Ihr Code ist 100% zwingend erforderlich. Sie können es mit FindReplace in C# konvertieren. Ich denke F # könnte hier nicht das beste Werkzeug sein. – Andrey