Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Krotka to grupowanie nienazwanych, ale uporządkowanych wartości, prawdopodobnie różnych typów. Krotki mogą być typami referencyjnymi lub strukturami.
Składnia
(element, ... , element)
struct(element, ... ,element )
Uwagi
Każdy element w poprzedniej składni może być dowolnym prawidłowym wyrażeniem języka F#.
Przykłady
Przykłady krotki obejmują pary, potrójne itd. z tego samego lub innego typu. Niektóre przykłady przedstawiono w poniższym kodzie.
(1, 2)
// Triple of strings.
("one", "two", "three")
// Tuple of generic types.
(a, b)
// Tuple that has mixed types.
("one", 1, 2.0)
// Tuple of integer expressions.
(a + 1, b + 1)
// Struct Tuple of floats
struct (1.025f, 1.5f)
Uzyskiwanie pojedynczych wartości
Do uzyskiwania dostępu i przypisywania nazw elementów krotki, jak pokazano w poniższym kodzie, można użyć dopasowania wzorca.
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
Możesz również dekonstruować krotkę za pomocą dopasowywania wzorca poza wyrażeniem match
za pomocą let
powiązania:
let (a, b) = (1, 2)
// Or as a struct
let struct (c, d) = struct (1, 2)
Możesz też dopasować wzorzec krotki jako dane wejściowe do funkcji:
let getDistance ((x1,y1): float*float) ((x2,y2): float*float) =
// Note the ability to work on individual elements
(x1*x2 - y1*y2)
|> abs
|> sqrt
Jeśli potrzebujesz tylko jednego elementu krotki, można użyć symbolu wieloznacznego (podkreślenia), aby uniknąć tworzenia nowej nazwy dla wartości, której nie potrzebujesz.
let (a, _) = (1, 2)
Kopiowanie elementów z krotki referencyjnej do krotki struktury jest również proste:
// Create a reference tuple
let (a, b) = (1, 2)
// Construct a struct tuple from it
let struct (c, d) = struct (a, b)
Funkcje fst
i snd
(tylko krotki referencyjne) zwracają pierwsze i drugie elementy krotki odpowiednio.
let c = fst (1, 2)
let d = snd (1, 2)
Nie ma wbudowanej funkcji, która zwraca trzeci element potrójny, ale można je łatwo napisać w następujący sposób.
let third (_, _, c) = c
Ogólnie rzecz biorąc, lepiej użyć dopasowania wzorca w celu uzyskania dostępu do poszczególnych elementów krotki.
Korzystanie z krotki
Krotki zapewniają wygodny sposób zwracania wielu wartości z funkcji, jak pokazano w poniższym przykładzie. Ten przykład wykonuje dzielenie całkowite i zwraca zaokrąglony wynik operacji jako pierwszy element członkowski pary krotki i resztę jako drugi element członkowski pary.
let divRem a b =
let x = a / b
let y = a % b
(x, y)
Krotki mogą być również używane jako argumenty funkcji, gdy chcesz uniknąć niejawnego currying argumentów funkcji, które są implikowane przez zwykłą składnię funkcji.
let sumNoCurry (a, b) = a + b
Zwykła składnia definiowania funkcji let sum a b = a + b
umożliwia zdefiniowanie funkcji, która jest częściowym zastosowaniem pierwszego argumentu funkcji, jak pokazano w poniższym kodzie.
let sum a b = a + b
let addTen = sum 10
let result = addTen 95
// Result is 105.
Używanie krotki jako parametru wyłącza currying. Aby uzyskać więcej informacji, zobacz "Częściowa aplikacja argumentów" w funkcjach.
Nazwy typów krotek
Podczas zapisywania nazwy typu, który jest krotką, należy użyć symbolu do oddzielenia *
elementów. W przypadku krotki składającej int
się z elementu , , float
i string
, takiego jak (10, 10.0, "ten")
, typ będzie zapisywany w następujący sposób.
int * float * string
Należy pamiętać, że nawiasy zewnętrzne są obowiązkowe podczas tworzenia aliasu typu dla typu krotki struktury.
type TupleAlias = string * float
type StructTupleAlias = (struct (string * float))
Współdziałanie z krotkami języka C#
Krotki w języku C# są strukturami i są równoważne krotkom struktury w języku F#. Jeśli musisz współpracować z językiem C#, musisz użyć krotki struktury.
Jest to łatwe do zrobienia. Załóżmy na przykład, że musisz przekazać krotkę do klasy języka C#, a następnie użyć jej wyniku, co jest również krotką:
namespace CSharpTupleInterop
{
public static class Example
{
public static (int, int) AddOneToXAndY((int x, int y) a) =>
(a.x + 1, a.y + 1);
}
}
W kodzie języka F# możesz następnie przekazać krotkę struktury jako parametr i użyć wyniku jako krotki struktury.
open TupleInterop
let struct (newX, newY) = Example.AddOneToXAndY(struct (1, 2))
// newX is now 2, and newY is now 3
Konwertowanie krotki referencyjnej i krotki struktury
Ponieważ krotki referencyjne i krotki struktury mają zupełnie inną podstawową reprezentację, nie są niejawnie konwertowane. Oznacza to, że kod, taki jak następujące, nie zostanie skompilowany:
// Will not compile!
let (a, b) = struct (1, 2)
// Will not compile!
let struct (c, d) = (1, 2)
// Won't compile!
let f(t: struct(int*int)): int*int = t
Należy dopasować wzorzec na jednej krotki i skonstruować drugą z częściami składowymi. Na przykład:
// Pattern match on the result.
let (a, b) = (1, 2)
// Construct a new tuple from the parts you pattern matched on.
let struct (c, d) = struct (a, b)
Skompilowana forma krotki referencyjnej
W tej sekcji opisano formę krotki podczas ich kompilowania. Informacje przedstawione w tym miejscu nie są konieczne do odczytania, chyba że jest przeznaczony program .NET Framework 3.5 lub nowszy.
Krotki są kompilowane w obiekty jednego z kilku typów ogólnych, wszystkie o nazwie System.Tuple
, które są przeciążone na arity lub liczba parametrów typu. Typy krotki są wyświetlane w tym formularzu podczas wyświetlania ich z innego języka, takiego jak C# lub Visual Basic, lub gdy używasz narzędzia, które nie zna konstrukcji języka F#. Typy Tuple
zostały wprowadzone w programie .NET Framework 4. Jeśli używasz starszej wersji programu .NET Framework, kompilator używa wersji System.Tuple
z wersji 2.0 biblioteki podstawowej języka F#. Typy w tej bibliotece są używane tylko dla aplikacji przeznaczonych dla wersji 2.0, 3.0 i 3.5 programu .NET Framework. Przekazywanie typów służy do zapewnienia zgodności binarnej między składnikami .NET Framework 2.0 i .NET Framework 4 F#.
Skompilowana forma krotki struktury
Krotki struktury (na przykład struct (x, y)
), różnią się zasadniczo od krotki referencyjnej. Są one kompilowane w ValueTuple typie, przeciążone przez arity lub liczbę parametrów typu. Są one równoważne krotkom języka C# i krotkom języka Visual Basic oraz współpracy dwukierunkowej.