f# - 如何从记录类型中调用字段?
问题描述
如果我有这样的类型:
type Cats =
{ Breed = string
Color = string
Alive = bool }
我将数据映射到它:
let mapdata =
Catfile.GetSample().Rows
|> Seq.map (fun row ->
{ Breed = row.breed
Color = row.color
Alive = row.status }
我如何从该记录中调用“品种”或“颜色”?我的想法是,它会是这样的:
Cats.Breed or Cats.Color
这是真的?
当我调用记录中的字段时,我的意思是调用映射到该字段的所有数据的序列。
编辑:
我希望能够根据上面的结果从另一个 csv 中过滤数据,而不必再次运行“mapdata”的整个功能。因此,我希望能够通过执行以下操作将结果与“Breed”隔离开来:Cats.Breed
调用该字段中的所有值并根据其是否在Cats.Breed
.
像这样的功能:
let similarvalues = Seq.Contains (OtherData) Cats.Breed
解决方案
您可以通过在记录实例上使用运算符来访问记录类型的属性.
,例如cat.Breed
. 由于您正在处理Cat
记录类型的集合,因此您需要在该序列上使用更高阶的函数来将.
运算符应用于每个实例并访问其属性。我们将使用您过滤包含猫的 CSV 文件的示例来演示其工作原理。
对于从第一个 CSV 文件生成的序列中的猫,您需要使用一个函数,例如根据您在第二个 CSV 文件中所在的行Seq.exists
检查每只猫的属性。Breed
这可能看起来像这样:
type Cat =
{ Breed: string
Color: string
Alive: bool
}
// Example CSV data type
type Row =
{ Breed: string
Color: string
Status: bool
}
let csvData =
// Load rows from CSV1
[{Breed = "fun"; Color = "lovely"; Status = true}]
|> Seq.map (fun row ->
{ Breed = row.Breed
Color = row.Color
Alive = row.Status })
// Check for matching data in CSV2
let similarData =
// Load rows from CSV2
[{Breed = "grumpy"; Color = "muddy"; Status = true}]
|> Seq.filter (fun row -> csvData |> Seq.exists (fun cat -> cat.Breed = row.Breed))
如您所见,在绑定时similarData
,我们Seq.filter
在第二个 CSV 文件中的每一行上使用该函数来仅查找从第一个 CSV 文件生成的序列中存在具有相同品种的猫的行。
推荐阅读
- mobx - 处理 mobx 中的输入变化
- php - 刷新div后Popover停止工作?
- python - 使用 python 或 bash 在多行文件中查找和替换模式
- php - 使用 ajax 在循环中填充表单字段
- javascript - 字符串文字第一个还是第二个串联?
- c# - Unity 中的浮动文本
- ruby-on-rails - 使用简单的 for 选择并保存多个复选框
- ruby-on-rails - 多态 has_and_belongs_to_many
- python - 如何根据部分字符串匹配加入两个数据框?
- python - 如何仅针对 Tensorflow 中的给定索引将矩阵乘以标量?