F # - Jenerikler
Jenerikler, aslında programda kullanılana kadar, bir sınıf veya yöntemdeki programlama öğelerinin veri türünün özelliklerini geciktirmenize olanak tanır. Diğer bir deyişle, jenerikler, herhangi bir veri türüyle çalışabilen bir sınıf veya yöntem yazmanıza izin verir.
Veri türleri için yedek parametrelerle birlikte sınıf veya yöntem için belirtimleri yazarsınız. Derleyici, sınıf için bir yapıcıyla veya yöntem için bir işlev çağrısıyla karşılaştığında, belirli veri türünü işlemek için kod üretir.
F # 'da işlev değerleri, yöntemler, özellikler ve sınıflar, kayıtlar ve ayrıştırılmış birleşimler gibi toplama türleri genel olabilir.
Genel yapılar en az bir tür parametresi içerir. Genel işlevler ve türler, her tür için kodu tekrarlamadan çeşitli türlerle çalışan kod yazmanıza olanak tanır.
Sözdizimi
Genel bir yapı yazmak için sözdizimi aşağıdaki gibidir -
// Explicitly generic function.
let function-name<type-parameters> parameter-list =
function-body
// Explicitly generic method.
[ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] =
method-body
// Explicitly generic class, record, interface, structure,
// or discriminated union.
type type-name<type-parameters> type-definition
Örnekler
(* Generic Function *)
let printFunc<'T> x y =
printfn "%A, %A" x y
printFunc<float> 10.0 20.0
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
10.0, 20.0
Tek tırnak işareti sözdizimini kullanarak da bir işlevi genel yapabilirsiniz -
(* Generic Function *)
let printFunction (x: 'a) (y: 'a) =
printfn "%A %A" x y
printFunction 10.0 20.0
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
10.0 20.0
Lütfen genel işlevleri veya yöntemleri kullandığınızda tür bağımsız değişkenlerini belirtmeniz gerekmeyebileceğini unutmayın. Bununla birlikte, bir belirsizlik olması durumunda, ilk örnekte yaptığımız gibi, açılı parantez içinde yazım bağımsız değişkenleri sağlayabilirsiniz.
Birden fazla türünüz varsa, birden çok tür bağımsız değişkenini virgülle ayırırsınız.
Genel Sınıf
Genel işlevler gibi, genel sınıflar da yazabilirsiniz. Aşağıdaki örnek bunu göstermektedir -
type genericClass<'a> (x: 'a) =
do printfn "%A" x
let gr = new genericClass<string>("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]