Что означает # перед именем типа в F #?

#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