Aracılığıyla paylaş


Esnek türleri (F#)

A esnek bir tür ek açıklaması bir parametre, değişken veya değer belirtilen türle uyumlu uyumluluk konumunu sınıfları veya arabirimleri ile nesne yönelimli bir hiyerarşide belirlendiği yerde bir türü olduğunu gösterir. Esnek türleri, özellikle türlerine tür hiyerarşisinde daha yüksek otomatik dönüştürme oluşmaz ancak hiyerarşisindeki herhangi bir tür veya arabirim uygulayan her türlü çalışmak kendi işlevlerini etkinleştirmek istediğiniz zamanlarda yararlıdır.

#type

Notlar

Önceki sözdiziminde, type taban türü bir arabirim temsil eder.

Esnek bir türü, temel veya arabirim türüyle uyumlu olan türleri için izin verilen türlerini sınırlayan bir kısıtlamaya sahip bir genel tür eşdeğerdir. Diğer bir deyişle, aşağıdaki iki kod satırı eşdeğerdir.

#SomeType

'a when 'a :> SomeType

Çeşitli türlerde durumlar, kullanışlı esnek türleridir. Daha yüksek bir sipariş işlevini (geçen bir işlev bağımsız değişken olarak bir işlev) olduğunda, örneğin, onu genellikle esnek türü dönmek işlevi sağlamak yararlıdır. Aşağıdaki örnekte, bir sıra bağımsız değişkeni ile esnek bir türünün kullanımı iterate2 serileri, diziler, listeleri ve diğer sýralanabilir türü oluşturmak işlevleriyle çalışmak daha yüksek sipariş işlevini sağlar.

Aşağıdaki iki işlevi, bir sıra a hangi verir, biri diğerinin esnek bir tür verir düşünün.

let iterate1 (f : unit -> seq<int>) =
    for e in f() do printfn "%d" e
let iterate2 (f : unit -> #seq<int>) =
    for e in f() do printfn "%d" e

// Passing a function that takes a list requires a cast.
iterate1 (fun () -> [1] :> seq<int>)

// Passing a function that takes a list to the version that specifies a
// flexible type as the return value is OK as is.
iterate2 (fun () -> [1])

Başka bir örnek olarak, göz önünde Seq.concat Kitaplığı işlevi:

val concat: sequences:seq<#seq<'T>> -> seq<'T>

Bu işleve aşağıdaki sýralanabilir sıralarının geçirebilirsiniz:

  • Listelerden oluşan liste

  • Diziler listesi

  • Bir dizi listeleri

  • Sıraları dizisi

  • Diğer herhangi bir bileşimini sýralanabilir serileri

Aşağıdaki kod Seq.concat esnek türleri kullanarak desteği senaryoları göstermek için.

let list1 = [1;2;3]
let list2 = [4;5;6]
let list3 = [7;8;9]

let concat1 = Seq.concat [ list1; list2; list3]
printfn "%A" concat1

let array1 = [|1;2;3|]
let array2 = [|4;5;6|]
let array3 = [|7;8;9|]

let concat2 = Seq.concat [ array1; array2; array3 ]
printfn "%A" concat2

let concat3 = Seq.concat [| list1; list2; list3 |]
printfn "%A" concat3

let concat4 = Seq.concat [| array1; array2; array3 |]
printfn "%A" concat4

let seq1 = { 1 .. 3 }
let seq2 = { 4 .. 6 }
let seq3 = { 7 .. 9 }

let concat5 = Seq.concat [| seq1; seq2; seq3 |]

printfn "%A" concat5

Çıktı aşağıdaki gibidir.

seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]

F# diğer nesne tabanlı diller gibi vardır bağlamları içinde türetilen türler veya arabirimleri uygulayan türler otomatik olarak bir temel türü veya arabirim türü dönüştürülür. Bu otomatik dönüşümleri doğrudan bağımsız değişkenler ancak türü, bir işlev türü dönüş türü gibi daha karmaşık bir tür bir parçası olarak ya da bir tür bağımsız değişkeni olarak bağımlı bir pozisyonda olmadığında oluşur. Bu nedenle, kendisine uygulama türü daha karmaþýk tür parçası olduğunda esnek tür tanımlama özellikle yararlıdır.

Ayrıca bkz.

Başvuru

Generics (F#)

Diğer Kaynaklar

F# dil başvurusu