Tupel (F#)

Ein Tupel ist eine Gruppe unbenannter, jedoch geordneter Werte von möglicherweise unterschiedlichen Typen.

( element , ... , element ) 

Hinweise

Jedes element in der vorherigen Syntax kann ein beliebiger Ausdruck sein.

Beispiele

Beispiele für Tupel sind Paare, Tripel usw. vom gleichen Typ oder von unterschiedlichen Typen. Einige Beispiele werden im folgenden Code veranschaulicht.

// Tuple of two integers.
( 1, 2 ) 

// Triple of strings.
( "one", "two", "three" ) 

// Tuple of unknown types.
( a, b ) 

// Tuple that has mixed types.
( "one", "1", "2.0" ) 

// Tuple of integer expressions.
( a + 1, b + 1) 

Abrufen von einzelnen Werten

Sie können mithilfe des Mustervergleichs Tupelelementen Namen zuweisen, bzw. darauf zugreifen, wie im folgenden Code gezeigt.

let print tuple1 =
   match tuple1 with
    | (a, b) -> printfn "Pair %A %A" a b

Sie können Tupelmuster in let-Bindungen wie folgt verwenden.

let (a, b) = (1, 2)

Hiermit werden die Werte a und b gleichzeitig gebunden. Wenn Sie nur ein Element des Tupels benötigen, kann das Platzhalterzeichen (Unterstrich) verwendet werden, um das Erstellen eines neuen Namens für eine nicht benötigte Variable zu vermeiden.

let (a, _) = (1, 2)

Die Funktionen fst und snd geben das erste bzw. zweite Element eines Tupels zurück.

let c = fst (1, 2)
let d = snd (1, 2)

Es gibt keine integrierte Funktion, die das dritte Element eines Tripels zurückgibt, Sie können jedoch eine solche Funktion problemlos wie folgt schreiben.

let third (_, _, c) = c

Im Allgemeinen empfiehlt es sich, für den Zugriff auf einzelne Tupelelemente Mustervergleich zu verwenden.

Verwenden von Tupeln

Tupel bieten eine zweckmäßige Möglichkeit, mehrere Werte von einer Funktion zurückzugeben, wie im folgenden Beispiel gezeigt. In diesem Beispiel wird eine ganzzahlige Division ausgeführt und das gerundete Ergebnis der Operation als erster Member eines Tupelpaars und der Rest als zweiter Member des Paars zurückgegeben.

let divRem a b = 
   let x = a / b
   let y = a % b
   (x, y)

Tupel können auch als Funktionsargumente verwendet werden, wenn Sie das mit der üblichen Funktionssyntax verbundene implizite Currying von Funktionsargumenten vermeiden möchten.

let sumNoCurry (a, b) = a + b

Die übliche Syntax zum Definieren der let sum a b = a + b-Funktion ermöglicht Ihnen, eine Funktion zu definieren, die die partielle Anwendung des ersten Arguments der Funktion ist, wie im folgenden Code gezeigt.

let addTen = sum 10
let result = addTen 95  
// Result is 105.

Durch die Verwendung eines Tupels als Parameter wird Currying deaktiviert. Weitere Informationen finden Sie unter "Partielle Anwendung von Argumenten" im Abschnitt Funktionen (F#).

Namen von Tupeltypen

Beim Schreiben des Namens eines Typs, der ein Tupel ist, werden Elemente mithilfe des "*"-Symbols (Sternchen) getrennt. Für ein Tupel, das aus einem int-, einem float- und einem string-Schlüsselwort besteht, z. B. (10, 10.0, "ten"), wird der Typ wie folgt geschrieben.

int * float * string

Tupel in kompilierter Form

Wenn Sie nur Tupel in F# verwenden, die Tupel nicht für andere Sprachen verfügbar machen möchten und nicht auf eine Version von .NET Framework vor Version 4 abzielen, können Sie diesen Abschnitt ignorieren.

Tupel werden in Objekte eines von mehreren generischen Typen kompiliert, alle mit Namen Tuple, die hinsichtlich der Stelligkeit bzw. Typparameteranzahl überladen sind. Tupeltypen werden in dieser Form dargestellt, wenn Sie sie in einer anderen Sprache anzeigen, z. B. C# oder Visual Basic, oder wenn Sie ein Tool verwenden, das keine F#-Konstrukte beachtet. Die Tuple-Typen wurden in .NET Framework 4 eingeführt. Wenn Sie auf eine frühere Version von .NET Framework abzielen, werden vom Compiler Versionen von System.Tuple aus der Version 2.0 der F#-Kernbibliothek verwendet. Die Typen in dieser Bibliothek werden nur für Anwendungen verwendet, die auf .NET Framework, Version 2.0, 3.0 und 3.5, abzielen. Die Typweiterleitung wird verwendet, um binäre Kompatibilität zwischen .NET Framework 2.0- und .NET Framework 4-F#-Komponenten sicherzustellen.

Siehe auch

Weitere Ressourcen

F#-Sprachreferenz

F#-Typen