gpt4 book ai didi

F# - 展平列表/范围

转载 作者:行者123 更新时间:2023-12-01 09:08:29 25 4
gpt4 key购买 nike

我是 F# 的新手,想知道如何将列表展平。

基本上在数据库中,我存储了一个 min_age 和 max_age 范围的记录(为了简洁起见,这是一个虚构的例子 - 我不是反对者!)。我的字段如下所示:

ID,
成本,
储蓄,
最小年龄,
最大年龄

我本质上有一个 F# 类,它充当与此表的一对一映射 - 即所有属性都准确映射到数据库字段。

我想做的是展平这个范围。所以,而不是包含这样的项目的列表:

saving_id = 1, cost = 100, savings = 20, min_age = 20, max_age = 26
saving_id = 2, cost = 110, savings = 10, min_age = 27, max_age = 31

我想要一个包含以下项目的列表:
saving_id = 1, cost = 100, savings = 20, age = 20
saving_id = 1, cost = 100, savings = 20, age = 21
etc.
saving_id = 2, cost = 110, savings = 10, age = 27
saving_id = 2, cost = 110, savings = 10, age = 28
etc.

是否有任何内置机制以这种方式展平列表和/或有人知道如何实现这一点?
提前致谢,

J.P

最佳答案

您可能想使用 Seq.collect。它将序列连接在一起,因此在您的情况下,您可以在输入上映射一个函数,该函数将单个年龄范围记录拆分为一系列年龄记录,并使用 Seq.collect 将它们粘合在一起。

例如:

type myRecord =
{ saving_id: int;
cost: int;
savings: int;
min_age: int;
max_age: int }

type resultRecord =
{ saving_id: int;
cost: int;
savings: int;
age: int }

let records =
[ { saving_id = 1; cost = 100; savings = 20; min_age = 20; max_age = 26 }
{ saving_id = 2; cost = 110; savings = 10; min_age = 27; max_age = 31 } ]

let splitRecord (r:myRecord) =
seq { for ageCounter in r.min_age .. r.max_age ->
{ saving_id = r.saving_id;
cost = r.cost;
savings = r.savings;
age = ageCounter }
}

let ageRanges = records |> Seq.collect splitRecord

编辑:您还可以使用带有 yield 的序列生成器!
let thisAlsoWorks = 
seq { for r in records do yield! splitRecord r }

关于F# - 展平列表/范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011828/

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