簡體   English   中英

在 F# 中組合 2 個列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM