FSharp Data 的 CsvProvider 中 "Load" 返回的类型是什么

What is the type returned by "Load" in FSharp Data's CsvProvider

考虑以下代码:

  type EnergyInfo = CsvProvider<"Sample.csv">

  let energyInfoBefore = EnergyInfo.Load("File1csv")
  let energyInfoAfter = EnergyInfo.Load("File2.csv")

  let expectedEnergyInfo =
    energyInfoBefore.Rows
      |> Seq.sortBy(fun r -> r.SomeProperty)
      |> Seq.map(fun r ->
        r.Property1,
        r.Property2,
        r.Property3,
        r.Property4,
        r.Property5,
        r.Property6,
        r.Property7)

  let actualEnergyInfo =
    energyInfoAfter.Rows
      |> Seq.sortBy(fun r -> r.SomeProperty)
      |> Seq.map(fun r ->
        r.Property1,
        r.Property2,
        r.Property3,
        r.Property4,
        r.Property5,
        r.Property6,
        r.Property7)  

"expectedInfoBefore" 和 "expectedInfoAfter" 几乎相同,自然我希望只有一个功能。

所以我想我会这样做:

  let getEnergyInfo energyInfo=
    energyInfo.Rows
      |> Seq.sortBy(fun r -> r.SomeProperty)
      |> Seq.map(fun r ->
        r.Property1,
        r.Property2,
        r.Property3,
        r.Property4,
        r.Property5,
        r.Property6,
        r.Property7)

但是,此时我的代码无法编译,因为 F# 编译器无法推断类型。

但是,我不知道 "energyInfo" 是什么类型。当我将鼠标悬停在后者上时,我被告知它是 "CsvProvider<...>" 类型。

由于我是 F# 和 F# 数据方面的新手,所以我不知道我必须做什么。

您的提供商返回的行的类型为 EnergyInfo.Row(惊喜!),整个文件的类型为 EnergyInfo.

编译器告诉你类型是CsvProvider<"Sample.csv">,因为EnergyInfoCsvProvider<"Sample.csv">的类型别名,编译器在错误信息中扩展了它。它可能会尝试提供更多帮助,但我不确定一般情况下是否可行。

您可以通过添加类型注释让编译器知道正确的类型:

let getEnergyInfo (energyInfo: EnergyInfo) =
    energyInfo.Rows
      |> Seq.sortBy(fun r -> r.SomeProperty)
      |> Seq.map(fun r ->
        r.Property1,
        r.Property2,
        r.Property3,
        r.Property4,
        r.Property5,
        r.Property6,
        r.Property7)