Как передать тип в качестве параметра функции в F #? - PullRequest
0 голосов
/ 08 июня 2018

Мой код ниже.Я пишу код для группировки, а затем усредняю ​​еще одну строку, что ниже.Но вместо того, чтобы передавать всю функцию каждый раз, я хочу иметь возможность просто передавать CSV или данные в качестве параметра функции в одну строку и делать это несколько раз для разных наборов данных.Как вы можете видеть из "row.income" и ".Rows", я использую ТИП, но когда я пытаюсь вызвать функцию позже с ТИПОМ, это выдает мне ошибку.Как бы я поступил так?

К вашему сведению, ошибки в том, что строки не существуют, потому что я использую «значения» в качестве параметра, а не фактический файл CSV, потому что я вызываю это позже.Эту ошибку мне нужно исправить, чтобы можно было вызывать определенную строку в функции при передаче типа в качестве параметра.

// When I try to call the function with Type

type Csvdata = CsvProvider<somefile>

state Csvdata

// This results in an error 

1 Ответ

0 голосов
/ 08 июня 2018

Вы не можете передать тип в качестве параметра описанным способом.Вы можете передать параметр универсального типа, но чтобы делать то, что вы хотите, синтаксис будет немного другим, потому что вам нужно будет использовать Статически разрешенные параметры типа для встроенной функции.Используя пример 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
...