Tupel

Tupel adalah pengelompokan nilai tanpa nama tetapi berurutan, dimungkinkan dalam berbagai jenis. Tupel dapat berupa jenis referensi atau struct.

Sintaks

(element, ... , element)
struct(element, ... ,element )

Keterangan

Setiap elemen dalam sintaks sebelumnya dapat berupa ekspresi F# yang valid.

Contoh

Contoh tupel termasuk pasangan, tripel, dan sebagainya, dari jenis yang sama atau berbeda. Beberapa contoh ditunjukkan 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 tupel, seperti yang ditunjukkan dalam kode berikut.

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

Anda juga dapat mendekonstruksi tupel melalui pencocokan pola di luar ekspresi match melalui pengikatan let:

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

// Or as a struct
let struct (c, d) = struct (1, 2)

Atau Anda dapat melakukan pencocokan pola pada tupel 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 tupel, karakter wildcard (garis bawah) dapat digunakan untuk menghindari pembuatan nama baru bagi nilai yang tidak Anda butuhkan.

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

Menyalin elemen dari tupel referensi ke dalam tupel 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 (hanya tupel referensi) mengembalikan elemen pertama dan kedua dari tupel, secara berurutan.

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

Tidak ada fungsi bawaan yang mengembalikan elemen ketiga dari tripel, tetapi Anda dapat dengan mudah menulisnya seperti berikut.

let third (_, _, c) = c

Umumnya, lebih baik menggunakan pencocokan pola untuk mengakses elemen tupel individu.

Penggunaan Tupel

Tupel menyediakan cara yang mudah untuk mengembalikan beberapa nilai dari fungsi, seperti yang ditunjukkan dalam contoh berikut. Contoh ini melakukan pembagian bilangan bulat dan mengembalikan hasil operasi yang dibulatkan sebagai anggota pertama dari pasangan tupel dan sisanya sebagai anggota kedua dari pasangan tersebut.

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

Tupel 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 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.

Penggunaan tupel sebagai parameter yang menonaktifkan kari. Untuk informasi selengkapnya, lihat "Aplikasi Parsial dari Argumen" di Fungsi.

Nama Jenis Tupel

Saat Anda menuliskan nama jenis yang merupakan tupel, Anda menggunakan simbol * untuk memisahkan elemen. Untuk tupel yang terdiri dari int, float, dan 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 tupel struct.

type TupleAlias = string * float
type StructTupleAlias = (struct (string * float))

Interoperasi dengan Tupel C#

Tupel dalam C# merupakan struct, dan setara dengan tupel struct di F#. Jika Anda perlu berinteroperasi dengan C#, Anda harus menggunakan tupel struct.

Ini adalah hal yang mudah untuk dilakukan. Misalnya, bayangkan Anda harus meneruskan tupel ke kelas C# dan kemudian memakai hasilnya, yang juga merupakan tupel:

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 tupel struct sebagai parameter dan memakai hasilnya sebagai tupel struct.

open TupleInterop

let struct (newX, newY) = Example.AddOneToXAndY(struct (1, 2))
// newX is now 2, and newY is now 3

Mengonversi antara Tupel Referensi dan Tupel Struct

Karena Tupel Referensi dan Tupel Struct memiliki representasi mendasar yang sama sekali berbeda, mereka tidak dapat dikonversi secara implisit. Artinya, kode seperti yang 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 melakukan pencocokan pola pada satu tupel dan membangun yang lain dengan bagian konstituen. Misalnya:

// 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 Kompilasi Tupel Referensi

Bagian ini menjelaskan bentuk tupel saat dikompilasi. Informasi yang ditampilkan di sini tidak perlu dibaca kecuali Anda menargetkan .NET Framework 3.5 atau lebih rendah.

Tupel dikompilasi menjadi objek dari salah satu jenis generik, semuanya bernama System.Tuple, yang kelebihan beban pada aritas, atau jumlah parameter jenis. Jenis tupel muncul dalam bentuk ini saat Anda melihatnya dari bahasa pemrogram lain, seperti C# atau Visual Basic, atau saat Anda menggunakan alat yang tidak mengetahui konstruksi F#. Jenis Tuple diperkenalkan di .NET Framework 4. Jika Anda menargetkan versi .NET Framework yang lebih lama, kompilator menggunakan versi System.Tuple dari versi 2.0 Pustaka Inti F#. 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 Tupel Struct

Tupel Struct (misalnya, struct (x, y)), pada dasarnya berbeda dari tupel referensi. Semuanya dikompilasi ke dalam jenis ValueTuple, kelebihan beban oleh aritas, atau jumlah parameter jenis. Mereka setara dengan C# Tuples dan Visual Basic Tuples, dan beroperasi dua arah.

Lihat juga