Esnek Türler
Esnek tür ek açıklaması , bir parametre, değişken veya değerin belirtilen tür ile uyumlu bir türe sahip olduğunu belirtir; burada uyumluluk, nesne odaklı sınıfların veya arabirimlerin bulunduğu konuma göre belirlenir. Esnek türler özellikle tür hiyerarşisinde daha üst türlere otomatik dönüştürme gerçekleşmezse yararlı olur ancak yine de işlevselliği hiyerarşide herhangi bir türle veya bir arabirim uygulayan herhangi bir tür ile çalışacak şekilde etkinleştirmek istiyorsanız.
Syntax
#type
Açıklamalar
Önceki sözdiziminde, tür bir temel türü veya arabirimi temsil eder.
Esnek tür, izin verilen türleri temel veya arabirim türüyle uyumlu türlere sınırlayan bir kısıtlamaya sahip genel bir tür ile eşdeğerdir. Diğer bir deyişle, aşağıdaki iki kod satırı eşdeğerdir.
#SomeType
'T when 'T :> SomeType
Esnek türler birkaç tür durumda yararlıdır. Örneğin, daha yüksek bir order işleviniz (bağımsız değişken olarak işlev alan bir işlev) olduğunda, işlevin esnek bir tür döndürmesi genellikle yararlı olur. Aşağıdaki örnekte, içinde bir dizi bağımsız değişkeni olan esnek bir tür kullanılması, iterate2 daha yüksek sıralı işlevin diziler, diziler, listeler ve diğer herhangi bir sıralanabilir tür oluşturan işlevlerle çalışmasını sağlar.
Aşağıdaki iki işlevi göz önünde bulundurun, bunlardan biri bir dizi döndürür, diğeri ise esnek bir tür döndürür.
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, Seq. Concat Kitaplık işlevini göz önünde bulundurun:
val concat: sequences:seq<#seq<'T>> -> seq<'T>
Aşağıdaki sıralanabilir dizileri bu işleve geçirebilirsiniz:
- Listelerin listesi
- Dizilerin listesi
- Listelerden oluşan bir dizi
- Dizi dizileri
- Sıralanabilir sıraların diğer birleşimleri
Aşağıdaki kod, Seq.concat Esnek türler kullanarak destekleyerek kullanabileceğiniz senaryoları göstermek için kullanır.
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 # ' da, diğer nesne yönelimli dillerde olduğu gibi, arabirimleri uygulayan türetilmiş türlerin veya türlerin otomatik olarak temel tür veya arabirim türüne dönüştürüldüğü bağlamlar vardır. Bu otomatik dönüştürmeler doğrudan bağımsız değişkenlerde oluşur, ancak tür bir alt konumda olduğunda değil, bir işlev türünün dönüş türü veya tür bağımsız değişkeni gibi daha karmaşık bir türün parçası olarak değildir. Bu nedenle, esnek tür gösterimi öncelikle, uyguladığınız tür daha karmaşık bir türün parçası olduğunda faydalıdır.