Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Tuple adalah pengelompokan nilai yang tidak disebutkan namanya tetapi diurutkan, mungkin dari berbagai jenis. Tuple dapat berupa jenis referensi atau struktur.
Sintaksis
(element, ... , element)
struct(element, ... ,element )
Komentar
Setiap elemen dalam sintaks sebelumnya dapat berupa ekspresi F# yang valid.
Contoh
Contoh tuple termasuk pasangan, tiga kali lipat, dan sebagainya, dari jenis yang sama atau berbeda. Beberapa contoh diilustrasikan dalam kode berikut.
(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)
Mendapatkan Nilai Individu
Anda dapat menggunakan pencocokan pola untuk mengakses dan menetapkan nama untuk elemen tuple, seperti yang ditunjukkan dalam kode berikut.
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
Anda juga dapat mendekonstruksi tuple melalui pencocokan pola di luar match ekspresi melalui let pengikatan:
let (a, b) = (1, 2)
// Or as a struct
let struct (c, d) = struct (1, 2)
Atau Anda dapat mencocokkan pola pada tuple sebagai input ke fungsi:
let getDistance ((x1,y1): float*float) ((x2,y2): float*float) =
// Note the ability to work on individual elements
(x1*x2 - y1*y2)
|> abs
|> sqrt
Jika Anda hanya memerlukan satu elemen tuple, karakter wildcard (garis bawah) dapat digunakan untuk menghindari pembuatan nama baru untuk nilai yang tidak Anda butuhkan.
let (a, _) = (1, 2)
Menyalin elemen dari tuple referensi ke dalam tuple struct juga sederhana:
// Create a reference tuple
let (a, b) = (1, 2)
// Construct a struct tuple from it
let struct (c, d) = struct (a, b)
Fungsi fst dan snd (tuple referensi saja) mengembalikan elemen pertama dan kedua dari tuple, masing-masing.
let c = fst (1, 2)
let d = snd (1, 2)
Tidak ada fungsi bawaan yang mengembalikan elemen ketiga dari tiga kali lipat, tetapi Anda dapat dengan mudah menulisnya sebagai berikut.
let third (_, _, c) = c
Umumnya, lebih baik menggunakan pencocokan pola untuk mengakses elemen tuple individual.
Menggunakan Tuple
Tuple menyediakan cara mudah untuk mengembalikan beberapa nilai dari fungsi, seperti yang ditunjukkan dalam contoh berikut. Contoh ini melakukan pembagian bilangan bulat dan mengembalikan hasil bulat dari operasi sebagai anggota pertama dari pasangan tuple dan sisanya sebagai anggota kedua dari pasangan tersebut.
let divRem a b =
let x = a / b
let y = a % b
(x, y)
Tuple juga dapat digunakan sebagai argumen fungsi ketika Anda ingin menghindari kari implisit argumen fungsi yang tersirat oleh sintaks fungsi biasa.
let sumNoCurry (a, b) = a + b
Sintaks yang biasa untuk menentukan fungsi let sum a b = a + b memungkinkan Anda menentukan fungsi yang merupakan aplikasi parsial dari argumen pertama fungsi, seperti yang ditunjukkan dalam kode berikut.
let sum a b = a + b
let addTen = sum 10
let result = addTen 95
// Result is 105.
Menggunakan tuple sebagai parameter menonaktifkan kari. Untuk informasi selengkapnya, lihat "Aplikasi Parsial Argumen" di Fungsi.
Nama Jenis Tuple
Saat Anda menulis nama jenis yang merupakan tuple, Anda menggunakan * simbol untuk memisahkan elemen. Untuk tuple yang terdiri dari int, , floatdan string, seperti (10, 10.0, "ten"), jenisnya akan ditulis sebagai berikut.
int * float * string
Perhatikan bahwa tanda kurung luar wajib saat membuat alias jenis untuk jenis tuple struct.
type TupleAlias = string * float
type StructTupleAlias = (struct (string * float))
Interoperatasi dengan C# Tuples
Tuple dalam C# adalah struktur, dan setara dengan struct tuples di F#. Jika Anda perlu beroperasi dengan C#, Anda harus menggunakan tuple struct.
Ini mudah dilakukan. Misalnya, bayangkan Anda harus meneruskan tuple ke kelas C# dan kemudian mengonsumsi hasilnya, yang juga merupakan tuple:
namespace CSharpTupleInterop
{
public static class Example
{
public static (int, int) AddOneToXAndY((int x, int y) a) =>
(a.x + 1, a.y + 1);
}
}
Dalam kode F#, Anda kemudian dapat meneruskan tuple struct sebagai parameter dan menggunakan hasilnya sebagai tuple struct.
open TupleInterop
let struct (newX, newY) = Example.AddOneToXAndY(struct (1, 2))
// newX is now 2, and newY is now 3
Mengonversi antara Tuple Referensi dan Struct Tuples
Karena Tuple Referensi dan Struct Tuples memiliki representasi yang mendasar yang sama sekali berbeda, mereka tidak dapat dikonversi secara implisit. Artinya, kode seperti berikut ini tidak akan dikompilasi:
// 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
Anda harus mencocokkan pola pada satu tuple dan membangun yang lain dengan bagian konstituen. Contohnya:
// 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)
Bentuk Tuple Referensi yang Dikompilasi
Bagian ini menjelaskan bentuk tuple saat dikompilasi. Informasi di sini tidak perlu dibaca kecuali Anda menargetkan .NET Framework 3.5 atau yang lebih rendah.
Tuple dikompilasi ke dalam objek dari salah satu dari beberapa jenis generik, semua bernama System.Tuple, yang kelebihan beban pada aritas, atau jumlah parameter jenis. Jenis tuple muncul dalam formulir ini saat Anda melihatnya dari bahasa lain, seperti C# atau Visual Basic, atau saat Anda menggunakan alat yang tidak menyadari konstruksi F#. Jenis Tuple diperkenalkan dalam .NET Framework 4. Jika Anda menargetkan versi .NET Framework yang lebih lama, pengkompilasi menggunakan versi System.Tuple dari versi 2.0 dari F# Core Library. Jenis dalam pustaka ini hanya digunakan untuk aplikasi yang menargetkan versi .NET Framework 2.0, 3.0, dan 3.5. Penerusan jenis digunakan untuk memastikan kompatibilitas biner antara komponen .NET Framework 2.0 dan .NET Framework 4 F#.
Bentuk Kompilasi Struct Tuples
Tuple struktur (misalnya, struct (x, y)), pada dasarnya berbeda dari tuple referensi. Mereka dikompilasi ke dalam ValueTuple jenis , kelebihan beban oleh aritas, atau jumlah parameter jenis. Mereka setara dengan C# Tuples dan Visual Basic Tuples, dan beroperasi dua arah.