[英]Combining 2 lists in F#
我有 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))
)
有沒有辦法,使用集合函數來做到這一點? 我不能使用 Seq.map 因為輸出與迭代總數不匹配
|> Seq.map (fun (y1, y2) -> (x1, y1, x2, y2))
不管用
您可以使用Seq.collect
來平面映射內部序列。
Collect(在 LINQ 中又名SelectMany
,在 JS 中也稱為flatMap
)將每個項目投影到一個新序列上,並將結果展平。
seqX
|> Seq.pairwise
|> Seq.collect(fun (x1, x2) -> seqY |> Seq.map(fun (y1, y2) -> (x1, x2, y1, y2))
或者你可以制作一個序列表達式來為你做這件事,對上面的內容進行脫糖:
seq {
for (x1, x2) in seqX |> Seq.pairwise do
for (y1, y2) in seqY |> Seq.pairwise do
yield (x1, x2, y1, y2)
}
當涉及深度時,序列表達式非常有用。 它比為每個級別編寫嵌套閉包要干凈得多( 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)
}
這將是更加丑陋的脫糖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.