请考虑以下代码:
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&lt; ...&gt;”。
由于我对F#和F#数据都不熟悉,我不知道自己该做什么。
答案 0 :(得分:3)
提供商返回的行的类型为EnergyInfo.Row
(惊喜!),整个文件的类型为EnergyInfo
。
编译器告诉您类型为CsvProvider<"Sample.csv">
,因为EnergyInfo
是CsvProvider<"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)