Udostępnij za pośrednictwem


Typy elastyczne (F#)

A typu elastyczne adnotacji wskazuje, że parametr, zmienna lub wartość ma typ, który jest zgodny z typem podana, gdzie zgodność jest określana w pozycji w hierarchii object-oriented klas lub interfejsów.Elastyczne typy są przydatne szczególnie automatycznej konwersji typów wyżej w hierarchii typu nie występują, ale nadal chcesz włączyć funkcję pracować z dowolnego typu w hierarchii lub dowolnego typu, który implementuje interfejs.

#type

Uwagi

W poprzednich składni type reprezentuje typ podstawowy lub interfejsu.

Elastyczne typu jest równoważne typ rodzajowy, który ma ograniczenie, które ogranicza typy dozwolonych do typów, które są zgodne z typem bazowym lub interfejsu.Oznacza to, że następujące dwa wiersze kodu są równoważne.

#SomeType

'a when 'a :> SomeType

Elastyczne typy są przydatne w kilku sytuacjach.Na przykład jeśli wyższe funkcji zamówienia (funkcja przyjmuje jako argument funkcji), jest często przydatne funkcja zwraca typ elastyczne.W poniższym przykładzie użycia elastycznych typu z argumentem sekwencji w iterate2 umożliwia wyższe funkcji zamówienie do pracy z funkcjami, które generowania sekwencji, tablice, list i innego typu agregującym.

Należy wziąć pod uwagę następujące dwie funkcje, jeden, które zwraca sekwencji, inne, z których zwraca typ elastyczne.

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

Inny przykład należy wziąć pod uwagę Seq.concat funkcji biblioteki:

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

Do tej funkcji można przekazać dowolną z następujących agregującym sekwencji:

  • Wykaz list

  • Wykaz tablic

  • Tablica list

  • Tablica sekwencji

  • Dowolna kombinacja agregującym sekwencji

Następujący kod dodaje do zastosowań Seq.concat do wykazania, scenariusze, które mogą obsługiwać przy użyciu elastycznych typów.

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

Wprowadza dane wyjściowe.

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# jak w innych językach obiektowych istnieją kontekstach, w których typów pochodnych lub które implementują interfejsy są automatycznie konwertowane na typ podstawowy lub typ interfejsu.Te automatyczne konwersje bezpośrednich argumentów, lecz nie w przypadku, gdy typ jest w stanie podrzędnego, jako część typu bardziej złożonych, takich jak typ zwracany typ funkcji lub jako argument typu.W ten sposób elastyczne typu notacji jest przydatna przede wszystkim gdy typu, który chcesz zastosować go do jest częścią bardziej złożonych typu.

Zobacz też

Informacje

Typy ogólne (F#)

Inne zasoby

Materiały referencyjne dotyczące języka F#