我有 2 个带有坐标的列表(每个轴一个),我正在用它们制作正方形:
// create all combinations
let squares = List<int * int * int * int>()
seqX
|> Seq.pairwise
|> Seq.iter (fun (x1, x2) ->
seqY
|> Seq.pairwise
|> Seq.iter (fun (y1, y2) -> squares.Add(x1, y1, x2, y2))
)
Run Code Online (Sandbox Code Playgroud)
有没有办法,使用集合函数来做到这一点?我不能使用 Seq.map 因为输出与迭代总数不匹配
|> Seq.map (fun (y1, y2) -> (x1, y1, x2, y2))
Run Code Online (Sandbox Code Playgroud)
不管用
您可以使用Seq.collect平面映射内部序列。
收集(SelectMany在 LINQ 和flatMapJS 中)将每个项目投影到一个新序列上,并将结果展平。
seqX
|> Seq.pairwise
|> Seq.collect(fun (x1, x2) -> seqY |> Seq.map(fun (y1, y2) -> (x1, x2, y1, y2))
Run Code Online (Sandbox Code Playgroud)
或者你可以制作一个序列表达式来为你做这件事,对上面的内容进行脱糖:
seq {
for (x1, x2) in seqX |> Seq.pairwise do
for (y1, y2) in seqY |> Seq.pairwise do
yield (x1, x2, y1, y2)
}
Run Code Online (Sandbox Code Playgroud)
当涉及深度时,序列表达式非常有用。这比为每个级别 ( seq |> Seq.collect (fun _ -> Seq.collect(fun...)编写嵌套闭包要干净得多。
这是一个示例,它通过遍历每个可能的三角形并检查勾股定理来找到所有边小于 10 的直角三角形。
seq {
let sides = [1..10]
for a in sides do
for b in sides do
for c in sides do
if a * a + b * b = c * c then
yield (a, b, c)
}
Run Code Online (Sandbox Code Playgroud)
这将是更加丑陋的脱糖。