gpt4 book ai didi

f# - 合并/加入 seq 的 seq

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

慢慢地掌握列表匹配和尾递归的窍门,我需要一个函数将列表“缝合”在一起,去掉中间值(更容易显示而不是解释):

合并 [[1;2;3];[3;4;5];[5;6;7]]//-> [1;2;3;4;5;6;7]

List.merge 函数的代码如下所示:

///Like concat, but removes first value of each inner list except the first one
let merge lst =
let rec loop acc lst =
match lst with
| [] -> acc
| h::t ->
match acc with
| [] -> loop (acc @ h) t
| _ -> loop (acc @ (List.tl h)) t //first time omit first value
loop [] lst

(好吧,它不太像concat,因为它只处理两级列表)

问题:如何对 Seq 的 Seq 执行此操作(不使用可变标志)?

更新 (来自朱丽叶的重新评论):
我的代码创建了由基于选项类型的“段”组成的“路径”:
type SegmentDef = Straight of float | Curve of float * float
let Project sampleinterval segdefs = //('clever' code here)

当我执行 List.map (Project 1.) ListOfSegmentDefs 时,我会得到一个列表,其中每个段都从前一个段结束的同一点开始。我想将这些列表连接在一起以获得一条路径,只保留每个重叠的“顶部/尾部” - 但我不需要做“设置”,因为我知道我没有任何其他重复项。

最佳答案

这与您的第一个解决方案基本相同,但更简洁:

let flatten l =
seq {
yield Seq.hd (Seq.hd l) (* first item of first list *)
for a in l do yield! (Seq.skip 1 a) (* other items *)
}

[编辑添加]:

如果您需要此代码的列表版本,请使用 append |> Seq.to_list在你的方法结束时:
let flatten l =
seq {
yield Seq.hd (Seq.hd l) (* first item of first list *)
for a in l do yield! (Seq.skip 1 a) (* other items *)
} |> Seq.to_list

关于f# - 合并/加入 seq 的 seq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502447/

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