Вы не можете передать тип в качестве параметра описанным способом.Вы можете передать параметр универсального типа, но чтобы делать то, что вы хотите, синтаксис будет немного другим, потому что вам нужно будет использовать Статически разрешенные параметры типа для встроенной функции.Используя пример csv.txt
со следующими данными:
name,income
bob,134.56
mary,350.13
Реализация будет выглядеть следующим образом:
let inline state< ^t, ^a, ^b when ^t: (static member GetSample: unit -> ^a)
and ^a: (member Rows: ^b seq)
and ^b: (member Income: decimal) > () =
let sample = (^t: (static member GetSample: unit -> ^a) ())
let rows = (^a: (member Rows: ^b seq) sample)
rows |> Seq.averageBy (fun row -> (^b: (member Income: decimal) row))
type Csvdata = CsvProvider<"csv.txt", HasHeaders = true>
state<Csvdata, CsvProvider<"csv.txt">, Csvdata.Row> ()
Здесь ^t
- это конкретный тип поставщика для вашегофайл, в данном случае Csvdata
, но нам требуется только метод с именем GetSample
, который возвращает другой тип, ^a
.^a
- это тип самого поставщика типов, в данном случае CsvProvider<"csv.txt">
, но нам требуется только свойство под названием Rows
, которое дает нам последовательность некоторого типа ^b
.Наконец, ^b
представляет тип каждой строки, в данном случае Csvdata.Row
, но нам требуется только свойство decimal
с именем Income
.
Используя таким образом ограничения типов, вы можете передать любую комбинацию типов, которая удовлетворяет ограничениям, поэтому она будет работать для любого CsvProvider
для любого файла CSV, имеющего столбец Income
.
Запуск кода для нашего файла примера дает следующий вывод:
val it : decimal = 242.345M