F # - Generika
Mit Generics können Sie die Angabe des Datentyps von Programmierelementen in einer Klasse oder Methode verzögern, bis er tatsächlich im Programm verwendet wird. Mit anderen Worten, mit Generika können Sie eine Klasse oder Methode schreiben, die mit jedem Datentyp arbeiten kann.
Sie schreiben die Spezifikationen für die Klasse oder die Methode mit Ersatzparametern für Datentypen. Wenn der Compiler auf einen Konstruktor für die Klasse oder einen Funktionsaufruf für die Methode stößt, generiert er Code für den spezifischen Datentyp.
In F # können Funktionswerte, Methoden, Eigenschaften und Aggregattypen wie Klassen, Datensätze und diskriminierte Vereinigungen generisch sein.
Generische Konstrukte enthalten mindestens einen Typparameter. Mit generischen Funktionen und Typen können Sie Code schreiben, der mit einer Vielzahl von Typen funktioniert, ohne den Code für jeden Typ zu wiederholen.
Syntax
Die Syntax zum Schreiben eines generischen Konstrukts lautet wie folgt:
// Explicitly generic function.
let function-name<type-parameters> parameter-list =
function-body
// Explicitly generic method.
[ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] =
method-body
// Explicitly generic class, record, interface, structure,
// or discriminated union.
type type-name<type-parameters> type-definition
Beispiele
(* Generic Function *)
let printFunc<'T> x y =
printfn "%A, %A" x y
printFunc<float> 10.0 20.0
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
10.0, 20.0
Sie können eine Funktion auch generisch machen, indem Sie die einfache Anführungszeichen-Syntax verwenden -
(* Generic Function *)
let printFunction (x: 'a) (y: 'a) =
printfn "%A %A" x y
printFunction 10.0 20.0
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
10.0 20.0
Beachten Sie, dass Sie bei Verwendung generischer Funktionen oder Methoden möglicherweise keine Typargumente angeben müssen. Im Falle einer Mehrdeutigkeit können Sie jedoch Typargumente in spitzen Klammern angeben, wie wir es im ersten Beispiel getan haben.
Wenn Sie mehr als einen Typ haben, trennen Sie mehrere Typargumente durch Kommas.
Generische Klasse
Wie generische Funktionen können Sie auch generische Klassen schreiben. Das folgende Beispiel zeigt dies -
type genericClass<'a> (x: 'a) =
do printfn "%A" x
let gr = new genericClass<string>("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )
Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:
"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]