Sdílet prostřednictvím


Flexibilní typy (F#)

A anotace typu flexibilní označuje hodnotu, proměnná nebo parametr je typu, který je kompatibilní s typem určený kde kompatibility je určena pozice v hierarchii objektově orientované tříd nebo rozhraní.Flexibilní typy jsou užitečné zejména typů výše v hierarchii typu automatického převodu nedochází, ale přesto chcete povolit své funkce pro práci s libovolného typu v hierarchii nebo libovolného typu, který implementuje rozhraní.

#type

Poznámky

V syntaxi předchozí type představuje základní typ nebo rozhraní.

Obecný typ, který má omezení, která omezuje povolené typy na typy, které jsou kompatibilní s typem rozhraní a základní je flexibilní typu.Následující dva řádky kódu, jsou ekvivalentní.

#SomeType

'a when 'a :> SomeType

Flexibilní typy jsou užitečné v několika typech situací.Například máte vyšší pořadí funkce (funkce, který převezme funkci jako argument), je často užitečné funkce vrátit flexibilní typu.Následující příklad použití flexibilní typu pořadí argumentu v iterate2 umožňuje vyšší pořadí funkce pro práci s funkcemi, které generují sekvence, pole, seznamy a jiný typ vyčíslitelné.

Zvažte následující dvě funkce, jeden které vrátí sekvence, které ostatní vrátí flexibilní typu.

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

Zvažte například Seq.concat funkce knihovny:

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

Můžete předat všechny následující posloupnosti agregující funkce:

  • Seznam seznamů

  • Seznam polí

  • Matice seznamy

  • Pole řad

  • Kombinace agregující sekvence

Následující kód používá Seq.concat prokázat scénářů, které mohou podporovat pomocí flexibilních typů.

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

Výstup je takto.

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; ...]

V F# jako v jiných jazycích objektově orientované jsou kontexty, které odvozené typy nebo typy, které implementují rozhraní jsou automaticky převedeny na základní typ nebo typ rozhraní.Tyto Automatické převody dojít přímé argumenty, ale není v podřízené pozici jako součást složitějších typ jako návratový typ typu funkce nebo jako argument typ po typu.Flexibilní typu zápis tedy především pokud je typ, který použijete k součástí složitější typu.

Viz také

Referenční dokumentace

Generics (F#)

Další zdroje

F# Language Reference