Tanımlama grupları

Tanımlama grubu, büyük olasılıkla farklı türlerde adsız ancak sıralı değerlerin bir gruplandırılmasıdır. Tanımlama kümeleri başvuru türleri veya yapılar olabilir.

Sözdizimi

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

Açıklamalar

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

Örnekler

Tanımlama grubu örnekleri arasında aynı veya farklı türlerdeki çiftler, üçlüler vb. yer alır. Aşağıdaki kodda bazı örnekler 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)

Tek Tek Değerleri Alma

Aşağıdaki kodda gösterildiği gibi tanımlama grubu öğelerine erişmek ve adları atamak için desen eşleştirmeyi kullanabilirsiniz.

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

Ayrıca bağlama yoluyla bir demetin yapısını, ifadenin match dışında desen eşleştirme yoluyla let da kaldırabilirsiniz:

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

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

İsterseniz, işlevlere giriş olarak tanımlama demetlerinde desen eşleştirmesi de yapabilirsiniz:

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

Tanımlama grubunun 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 tanımlama grubundaki öğeleri bir yapı tanımlama grubuna kopyalamak da kolaydır:

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

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

ve snd işlevleri fst (yalnızca başvuru tanımlama kümeleri), sırasıyla bir tanımlama grubunun birinci ve ikinci öğelerini döndürür.

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

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

let third (_, _, c) = c

Genel olarak, tek tek tanımlama grubu öğelerine erişmek için desen eşleştirme kullanmak daha iyidir.

Tanımlama Demetlerini Kullanma

Tanımlama kümeleri, 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 tamsayı bölme işlemi gerçekleştirir ve işlemin yuvarlanmış sonucunu bir tanımlama grubu çiftinin ilk üyesi, kalan kısmını da çiftin ikinci üyesi olarak döndürür.

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

Tanımlama demetleri, normal işlev söz diziminin zımni olduğu işlev bağımsız değişkenlerinin örtük currying'inden kaçınmak istediğinizde işlev bağımsız değişkenleri olarak da kullanılabilir.

let sumNoCurry (a, b) = a + b

İşlevi let sum a b = a + b tanımlamak için normal söz dizimi, 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 İşlevler'deki "Kısmi Bağımsız Değişkenlerin Uygulaması" bölümüne bakın.

Tanımlama Grubu Türlerinin Adları

Tanımlama grubu olan bir türün adını yazdığınızda, öğeleri ayırmak için simgeyi * kullanırsınız. bir , floatve gibi (10, 10.0, "ten")bir intiçeren bir stringtanımlama grubu için, türü aşağıdaki gibi yazılır.

int * float * string

Yapı tanımlama grubu türü için tür diğer adı oluşturulurken dış parantezlerin zorunlu olduğunu unutmayın.

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

C# Demetleri ile birlikte çalışma

C# içindeki tanımlama kümeleri yapılardır ve F# içindeki yapı demetlerine eşdeğerdir. C# ile birlikte çalışmanız gerekiyorsa, yapı tanımlama demetlerini kullanmanız gerekir.

Bunu yapmak kolaydır. Örneğin, bir tanımlama kümesini bir C# sınıfına geçirmeniz ve ardından aynı zamanda bir tanımlama grubu olan sonucunu kullanmanız gerekir:

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

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

open TupleInterop

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

Başvuru Demetleri ile Yapı Demetleri arasında dönüştürme

Başvuru Demetleri ve Yapı Demetleri tamamen farklı bir temel gösterime sahip olduğundan örtük olarak dönüştürülebilir değildir. Başka bir ifadeyle, aşağıdaki gibi 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

Bir tanımlama grubu üzerinde desen eşleşmesi ve diğerini kurucu parçalar ile oluşturmanız gerekir. Örneğin:

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

Derlenmiş Başvuru Demetleri Formu

Bu bölümde, derlenen tanımlama demetlerinin biçimi açıklanmaktadır. .NET Framework 3.5 veya daha düşük bir sürümü hedeflemediğiniz sürece buradaki bilgilerin okunması gerekmez.

Demetler, tümü adlı System.Tuple, arity veya tür parametreleri sayısı üzerinde aşırı yüklenmiş olan çeşitli genel türlerden birine ait nesneler halinde derlenir. Tanımlama grubu türleri, bunları C# veya Visual Basic gibi başka bir dilde görüntülediğinizde veya F# yapılarından haberdar olmayan bir araç kullandığınızda bu formda görünür. Türler Tuple .NET Framework 4'te kullanıma sunulmuştur. .NET Framework'ün önceki bir sürümünü hedef alıyorsanız, derleyici F# Çekirdek Kitaplığı'nın 2.0 sürümünden sürümlerini kullanır System.Tuple . Bu kitaplıktaki türler yalnızca .NET Framework'ün 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 uyumluluğu sağlamak için kullanılır.

Yapı Demetlerinin Derlenmiş Biçimi

Yapı demetleri (örneğin, struct (x, y)), başvuru demetlerinden temel olarak farklıdır. Türüne ValueTuple derlenirler, arity veya tür parametrelerinin sayısı tarafından aşırı yüklenirler. C# Demetleri ve Visual Basic Demetleri ile eşdeğerdir ve çift yönlü olarak birlikte çalışır.

Ayrıca bkz.