F#CsvTypeProvider - 来自推断类型的映射函数

sev*_*rin 3 f# type-providers f#-data

我正在使用CsvTypeProvider将CSV文件中的数据映射到我自己的数据结构中.这非常有效,除了我必须每次都重复映射功能:

type GamesFile = CsvProvider<"./data/15.csv">
let games15 = GamesFile.Load("./data/15.csv").Rows |> Seq.map ( fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore })
let games16 = GamesFile.Load("./data/16.csv").Rows |> Seq.map ( fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore })
Run Code Online (Sandbox Code Playgroud)

当我尝试将它移动到一个函数时,我被告知"基于此程序点之前的信息查找不确定类型的对象.在此程序点之前可能需要类型注释来约束对象的类型.这可能允许解析查找."

这是有道理的,但是如何从CSV的内容推断类型时,如何告诉映射函数它是什么类型?这通常如何解决?

Tom*_*cek 5

类型提供程序生成一个表示该行的类型,并将其公开为主要提供类型的嵌套类型 - 在您的情况下为别名GamesFile.

这并不完全是显而易见的,因为编辑器会显示工具提示,因为
CsvFile<...>.Row它不会显示别名的名称,但它建议Row使用嵌套类型.要在代码中使用该类型,您只需编写GamesFile.Row,因此您需要这样的内容:

type GamesFile = CsvProvider<"./data/15.csv">

let mapRows (rows:seq<GamesFile.Row>) = 
  rows |> Seq.map (fun c -> 
    { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore })

let games15 = GamesFile.Load("./data/15.csv").Rows |> mapRows
let games16 = GamesFile.Load("./data/16.csv").Rows |> mapRows
Run Code Online (Sandbox Code Playgroud)