FSharp Data的CsvProvider中“加载”返回的类型是什么

时间:2017-11-01 18:40:57

标签: f# f#-data

请考虑以下代码:

  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#编译器无法推断出类型。

enter image description here

但是,我不知道“energyInfo”是什么类型的。当我将鼠标悬停在后者上时,我被告知它的类型为“CsvProvider&lt; ...&gt;”。

由于我对F#和F#数据都不熟悉,我不知道自己该做什么。

1 个答案:

答案 0 :(得分:3)

提供商返回的行的类型为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)