gpt4 book ai didi

f# - Seq.map 从一个列表填充另一个不同类型的列表?

转载 作者:行者123 更新时间:2023-12-04 02:28:10 27 4
gpt4 key购买 nike

此问题是对先前问题 Preserving Field names across the F#/C# boundary 的跟进

由于当前 F# 类型提供程序遇到的限制(请参阅前面的问题),我想将类型提供程序生成的列表映射到我自己的记录列表,其中记录部分是,

type inspection = {
inspectionID : string;
inspectorID : int;
EstablishmentID : string;
EstablishmentName : string; // other members elided
}

我认为这样做的方法将使用 Seq.map,但我不确定。 (回想一下我正在做一个学习练习。)所以这是我尝试过的:

type restaurantCsv = CsvProvider<"C:\somepath\RestaurantRatings2013.csv",HasHeaders=true> 
// which generates a type, but it is an "erased" type, so member names do not propogate
// over to C#.

type RawInspectionData(filename : string) =
member this.allData = restaurantCsv.Load(filename) // works fine

member this.allInspections =
this.allData.Data
|> Seq.map(fun rcrd -> new inspection[{inspectionID = rcrd.InspectionID;}])

当然,完整的声明会将其他成员姓名作为检查的一部分,为简洁起见,此处省略。有人向我指出了 F# For Scientists 的第 43 页,这就是为什么我想使用这种带有大括号的格式。但这会产生语法错误,“表达式中出现意外符号 '{'。需要 ',', ']' 或其他标记。”

不过,希望这个片段足以展示我想做的事情,从删除的类型创建一个生成的类型。我怎样才能做到这一点?

最佳答案

您的代码正朝着正确的方向发展。在使用Seq.map(类似于LINQ中的Select)时,需要将原序列的单个元素转换为新序列的单个元素。所以 lambda 函数只需要创建记录的单个实例。

记录是使用 { Field1 = value1;字段 2 = 值 2; ... 所以你需要:

type RawInspectionData(filename : string) = 
let allData = restaurantCsv.Load(filename) // works fine
member this.allInspections =
allData.Data
|> Seq.map(fun rcrd -> {inspectionID = rcrd.InspectionID})

我还将 allData 从成员更改为本地 let 定义(这使其成为类的私有(private)字段)。我想你的原始代码 new inspection[{...}] 试图用元素创建一个单例数组 - 要创建一个你会写的数组 [| { 字段 = 值; ... } |] (编译器会为您推断数组的类型)。但在这种情况下,不需要数组。

关于f# - Seq.map 从一个列表填充另一个不同类型的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21974037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com