Demetler

Kayıt düzeni , farklı türlerde olabilecek adlandırılmamış ancak sıralanmış değerlerin bir gruplandırmasıdır. Tanımlama grupları başvuru türleri ya da yapılar olabilir.

Syntax

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

Açıklamalar

Önceki söz diziminde her öğe geçerli bir F # ifadesi olabilir.

Örnekler

Tanımlama gruplarına örnek olarak, aynı veya farklı türlerde çiftler, Üçlü, vb. dahildir. Bazı örnekler aşağıdaki kodda gösterilmiştir.

(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)

Ayrı değerler alma

Aşağıdaki kodda gösterildiği gibi, kayıt düzeni öğelerine erişmek ve adları atamak için model eşleştirmeyi kullanabilirsiniz.

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

Ayrıca bağlama yoluyla bir ifadenin dışındaki bir düzeni kullanarak bir tanımlama grubu oluşturabilirsiniz match let .

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

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

Ya da, diziler üzerinde farklı işlevlere giriş olarak de kalıp eşleştirebilirsiniz:

let getDistance ((x1,y1): float*float) ((x2,y2): float*float) =
    // Note the ability to work on individual elements
    (x1*x2 - y1*y2) 
    |> abs 
    |> sqrt

Kayıt düzeninin yalnızca bir öğesine ihtiyacınız varsa, ihtiyacınız olmayan bir değer için yeni bir ad oluşturmaktan kaçınmak için joker karakter (alt çizgi) kullanılabilir.

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

Bir başvuru kayıt kümesinden yapı grubu içine öğe kopyalamak de basittir:

// Create a reference tuple
let (a, b) = (1, 2)

// Construct a struct tuple from it
let struct (c, d) = struct (a, b)

İşlevler fst ve snd (yalnızca başvuru tanımlama grupları), bir başlığın sırasıyla ilk ve ikinci öğelerini döndürür.

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

Üçlü öğesinin üçüncü öğesini döndüren yerleşik bir işlev yoktur, ancak aşağıdaki gibi kolayca bir tane yazabilirsiniz.

let third (_, _, c) = c

Genellikle, tek tek demet öğelerine erişmek için model eşleştirmeyi kullanmak daha iyidir.

Tanımlama gruplarını kullanma

Tanımlama grupları, aşağıdaki örnekte gösterildiği gibi bir işlevden birden çok değer döndürmek için kullanışlı bir yol sağlar. Bu örnek, tam sayı bölümü gerçekleştirir ve bir demet çiftinin ilk üyesi olarak işlemin yuvarlanmış sonucunu ve çiftinin ikinci bir üyesi olarak geri kalanını döndürür.

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

Ayrıca, normal işlev sözdizimi tarafından kapsanan işlev bağımsız değişkenlerinin örtük olarak oluşmasını önlemek istediğinizde, diziler işlev bağımsız değişkeni olarak kullanılabilir.

let sumNoCurry (a, b) = a + b

İşlevi tanımlamaya yönelik olağan sözdizimi, let sum a b = a + b aşağıdaki kodda gösterildiği gibi, işlevin ilk bağımsız değişkeninin kısmi uygulaması olan bir işlev tanımlamanızı sağlar.

let sum a b = a + b

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

Parametre olarak bir tanımlama grubu kullanmak, currying 'i devre dışı bırakır. Daha fazla bilgi için, bkz. işlevlerde"bağımsız değişkenlerin kısmi uygulaması".

Demet türlerinin adları

Tanımlama grubu olan bir türün adını yazdığınızda, * öğeleri ayırmak için simgesini kullanın. , Gibi bir,, ve içeren bir tanımlama grubu için, int float string (10, 10.0, "ten") tür şöyle yazılır.

int * float * string

Yapı tanımlama grubu türü için bir tür diğer adı oluştururken dış parantezler zorunlu olduğuna unutmayın.

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

C# tanımlama grupları ile birlikte çalışma

C# 7,0, tanımlama gruplarını dile sunmuştur. C# ' deki diziler yapılar ve F # ' daki yapı tanımlama grupları ile eşdeğerdir. C# ile birlikte çalışmanız gerekiyorsa struct tanımlama gruplarını kullanmanız gerekir.

Bu kolay bir işlemdir. Örneğin, bir tanımlama grubunu C# sınıfına geçirmeniz ve sonra da bir tanımlama grubu olan sonucunu tüketmeniz gerektiğini düşünün:

namespace CSharpTupleInterop
{
    public static class Example
    {
        public static (int, int) AddOneToXAndY((int x, int y) a) =>
            (a.x + 1, a.y + 1);
    }
}

F # kodunuzda, bir yapı tanımlama grubunu parametre olarak geçirebilir ve sonucu bir struct demet olarak kullanabilirsiniz.

open TupleInterop

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

Başvuru tanımlama grupları ve yapı tanımlama grupları arasında dönüştürme

Başvuru başlıkları ve yapı tanımlama gruplarının tamamen farklı bir temel temsili olduğundan, bunlar örtülü olarak dönüştürülebilir değildir. Diğer bir deyişle, aşağıdaki gibi bir kod derlenmez:

// 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

Tek bir kayıt düzeninde kalıp eşleşmesi gerekir ve diğer bileşenleri oluşturan parçalar ile oluşturun. Örnek:

// 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)

Başvuru tanımlama gruplarının derlenmiş formu

Bu bölüm, derlendikleri zaman başlıkların biçimini açıklar. .NET Framework 3,5 veya daha düşük bir sürüm hedeflenmediğiniz müddetçe buradaki bilgiler okunmanıza gerek yoktur.

Tanımlama grupları, birden fazla genel türden biri olan, System.Tuple parametre sayısı üzerinde aşırı yüklenmiş olan tüm adlandırılmış nesneler veya tür parametrelerinin sayısıyla derlenir. bu formda, C# veya Visual Basic gibi başka bir dilde görüntülediğinizde ya da F # yapıları farkında olmayan bir araç kullanırken demet türleri görüntülenir. Tupletürler .NET Framework 4 ' te tanıtılmıştı. .NET Framework önceki bir sürümünü hedefliyorsanız, derleyici System.Tuple F # çekirdek kitaplığının 2,0 sürümündeki sürümlerini kullanır. Bu kitaplıktaki türler yalnızca .NET Framework 2,0, 3,0 ve 3,5 sürümlerini hedefleyen uygulamalar için kullanılır. tür iletme, .NET Framework 2,0 ve .NET Framework 4 F # bileşenleri arasında ikili uyumluluk sağlamak için kullanılır.

Yapı tanımlama gruplarının derlenmiş formu

Yapı tanımlama grupları (örneğin, struct (x, y) ), başvuru dizklarından temelde farklıdır. Bunlar ValueTuple türü, parametre sayısına göre aşırı yüklendi veya tür parametrelerinin sayısı olarak derlenir. C# 7,0 tanımlama gruplarına ve Visual Basic 2017 tanımlamagruplarına eşdeğerdir ve birlikte çalışır.

Ayrıca bkz.