#f#
Вопрос:
Что означает a #
перед именем типа в F #?
Например, здесь:
let getTestData (inner : int [] -> #seq<int>) (outer : #seq<int> [] -> #seq<'U>) =
(testData |> Array.map inner) |> outer
Ответ №1:
Синтаксис #type
называется «гибким типом», и это сокращение для обозначения того, что тип может быть любым типом, который реализует данный интерфейс. Это полезно в тех случаях, когда пользователь функции может захотеть указать конкретный тип (например, массив или список).
Для очень простого примера давайте посмотрим на это:
let printAll (f: unit -> seq<int>) =
for v in f () do printfn "%d" v
Вызывающий должен вызвать printAll
с помощью лямбда-выражения, которое возвращает последовательность:
printAll (fun () -> [1; 2; 3]) // Type error
printAll (fun () -> [1; 2; 3] :> seq<int>) // Works, but tedious to write!
Если вы используете гибкий тип, возвращаемый тип функции может быть любой реализацией seq<int>
:
let printAll (f: unit -> #seq<int>) =
for v in f () do printfn "%d" v
printAll (fun () -> [1; 2; 3]) // No problem!
На самом деле синтаксис #typ
— это просто ярлык для высказывания 'T when 'T :> typ
, поэтому вы можете переписать функцию в моем примере как:
let printAll<'T when 'T :> seq<int>> (f: unit -> 'T) =
for v in f () do printfn "%d" v